Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando DATE_ADD com um nome de coluna como o valor do intervalo


Não será fácil obter seu resultado - já que você o está armazenando como 1 Year simples ou similar. Não é não permitido usá-lo dinamicamente em INTERVAL construct - sintaxe MySQL demandas que você apontará a quantidade e o tipo do intervalo.

No entanto, há uma espécie de truque para resolver o assunto:
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

-como você pode ver, esta consulta depende do fato, que a quantidade sempre vai primeiro (então CAST irá extraí-lo exatamente, portanto, ele pode ser usado para obter o comprimento do intervalo depois disso). Mas em qualquer caso, você terá que recontar todos os possíveis tipos de intervalo em CASE cláusula

Outra boa ideia seria - armazenar seu período de forma unificada (por exemplo, sempre em dias) - para armazenar apenas um número para cada linha (assim, 1 semana =7 dias, etc.)