Det blir inte lätt att få ditt resultat - eftersom du lagrar det som vanligt 1 Year
eller liknande. Det är inte tillåts använda det dynamiskt i INTERVAL
konstruktion - MySQL-syntax krav
att du pekar på både intervallkvantitet och typ.
Det finns dock ett slags knep för att lösa problemet:
SELECT
product_name,
start_date,
expiry_period,
@num:=CAST(expiry_period AS UNSIGNED),
@p :=SUBSTR(expiry_period, CHAR_LENGTH(@num)+2),
CASE
WHEN @p='Year' THEN DATE_ADD(start_date, INTERVAL @num YEAR)
WHEN @p='Month' THEN DATE_ADD(start_date, INTERVAL @num MONTH)
WHEN @p='Day' THEN DATE_ADD(start_date, INTERVAL @num DAY)
WHEN @p='Week' THEN DATE_ADD(start_date, INTERVAL @num WEEK)
END AS end_date
FROM
tbl_products
-som du kan se bygger denna fråga på faktum, att kvantiteten alltid går först (så CAST
kommer att extrahera exakt det, därför kan det användas för att få intervalllängd efter detta). Men i alla fall måste du räkna om alla möjliga intervalltyper i CASE
klausul
En annan bra idé skulle vara - att lagra din mens i enhetlig form (till exempel alltid i dagar) - så att du bara lagrar ett nummer för varje rad (därmed 1 vecka=7 dagar, etc.)