sql >> Base de Datos >  >> RDS >> Mysql

Uso de DATE_ADD con un nombre de columna como valor de intervalo

No será fácil obtener su resultado, ya que lo está almacenando como simple 1 Year o similar. No es no permitido usarlo dinámicamente en INTERVAL construcción:sintaxis de MySQL exigencias que señalará tanto la cantidad como el tipo del intervalo.

Sin embargo, hay una especie de truco para resolver el asunto:

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 puede ver, esta consulta se basa en el hecho de que la cantidad siempre va primero (así que CAST lo extraerá exactamente, por lo tanto, se puede usar para obtener la longitud del intervalo después de esto). Pero en cualquier caso, tendrás que contar todos los posibles tipos de intervalo en CASE cláusula

Otra buena idea sería:almacenar su período en forma unificada (por ejemplo, siempre en días), de modo que solo almacene un número para cada fila (por lo tanto, 1 semana =7 días, etc.)