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

Brug af DATE_ADD med et kolonnenavn som intervalværdi

Det bliver ikke nemt at få dit resultat - da du gemmer det som almindeligt 1 Year eller lignende. Det er ikke tilladt at bruge det dynamisk i INTERVAL konstruktion - MySQL-syntaks krav at du vil pege både intervalmængde og type.

Der er dog et slags trick til at løse sagen:

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, er denne forespørgsel afhængig af faktum, at mængden altid går først (så CAST vil udtrække præcis det, derfor kan det bruges til at få intervallængde efter dette). Men under alle omstændigheder bliver du nødt til at tælle alt muligt om intervaltyper i CASE klausul

En anden god idé ville være - at gemme din menstruation i samlet form (f.eks. altid i dage) - så du kun gemmer ét tal for hver række (altså 1 uge=7 dage, osv.)



  1. mysql betinget join afhænger af en kolonne

  2. PostgreSQL Logical Replication Gotchas

  3. java.sql.SQLEundtagelse:- ORA-01000:maksimale åbne markører overskredet

  4. Sådan forbedres MySQL AWS-ydeevne 2X over Amazon RDS til samme pris