sql >> Databasteknik >  >> RDS >> Mysql

Använder DATE_ADD med ett kolumnnamn som intervallvärde

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.)



  1. Introduktion till SQL-kommandon

  2. Hur man skyddar MySQL-databaser från Ransomware-kampanjer

  3. Använd TYPE_ID() för att få ID för en datatyp i SQL Server

  4. Oracle sammanfogar sträng- och nummerexempel