sql >> Database >  >> RDS >> Mysql

DATE_ADD gebruiken met een kolomnaam als intervalwaarde

Het zal niet gemakkelijk zijn om uw resultaat te krijgen - aangezien u het opslaat als gewoon 1 Year of vergelijkbaar. Het is niet mag het dynamisch gebruiken in INTERVAL construct - MySQL-syntaxis eisen dat u zowel de intervalhoeveelheid als het type aangeeft.

Er is echter een soort truc om de zaak op te lossen:

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

-zoals je kunt zien, is deze zoekopdracht gebaseerd op het feit dat die hoeveelheid altijd eerst staat (dus CAST zal het precies extraheren, daarom kan het worden gebruikt om daarna de intervallengte te krijgen). Maar in ieder geval moet je alle mogelijke opnoemen intervaltypes in CASE clausule

Een ander goed idee zou zijn - om uw menstruatie in uniforme vorm op te slaan (bijvoorbeeld altijd in dagen) - zodat u slechts één nummer voor elke rij opslaat (dus 1 week =7 dagen, enz.)



  1. Primaire sleutel verwijderen in MySQL

  2. Hoe kan ik kolommen over meerdere tabellen in MySQL optellen?

  3. Beste manier om afbeeldingen op te slaan die afkomstig zijn van de server in Android

  4. Hoe kan ik de taak scripts genereren in SQL Server Management Studio 2008 automatiseren?