Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden von DATE_ADD mit einem Spaltennamen als Intervallwert

Es wird nicht einfach sein, Ihr Ergebnis zu erhalten, da Sie es einfach als 1 Year speichern oder ähnliches. Es ist nicht erlaubt, es dynamisch in INTERVAL zu verwenden Konstrukt - MySQL-Syntax fordert dass Sie sowohl die Intervallmenge als auch den Typ angeben.

Es gibt jedoch eine Art Trick, um das Problem zu lösen:

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

-wie Sie sehen, beruht diese Abfrage auf der Tatsache, dass die Menge immer zuerst kommt (also CAST wird es genau extrahieren, daher kann es verwendet werden, um danach die Intervalllänge zu erhalten). Aber in jedem Fall müssen Sie alles Mögliche nachzählen Intervalltypen in CASE Klausel

Eine andere gute Idee wäre - Ihre Periode in einheitlicher Form zu speichern (z. B. immer in Tagen) - so dass Sie nur eine Zahl für jede Zeile speichern (also 1 Woche =7 Tage usw.)