Mysql
 sql >> Database >  >> RDS >> Mysql

Utilizzo di DATE_ADD con un nome di colonna come valore dell'intervallo

Non sarà facile ottenere il risultato, dal momento che lo stai memorizzando come semplice 1 Year o simili. non permesso di usarlo dinamicamente in INTERVAL build - La sintassi MySQL richieste che indicherai sia la quantità che il tipo di intervallo.

Tuttavia, c'è una specie di trucco per risolvere la questione:

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

-come puoi vedere, questa query si basa sul fatto che quella quantità va sempre per prima (quindi CAST lo estrarrà esattamente, quindi può essere utilizzato per ottenere la lunghezza dell'intervallo dopo questo). Ma in ogni caso dovrai raccontare tutto il possibile tipi di intervallo in CASE clausola

Un'altra buona idea sarebbe quella di memorizzare il ciclo in forma unificata (ad esempio, sempre in giorni), in modo da memorizzare un solo numero per riga (quindi, 1 settimana=7 giorni, ecc.)