Using DATE_ADD with a Column Name as the Interval Value

后端 未结 2 1144
离开以前
离开以前 2021-01-11 17:32

I have a table which contains products, a start date and an interval value :

product_name                    start_date              expiry_period
Domain Reg         


        
2条回答
  •  不知归路
    2021-01-11 18:11

    It won't be easy o get your result - since you're storing it as plain 1 Year or similar. It is not allowed to use it dynamically in INTERVAL construct - MySQL syntax demands that you'll point both interval quantity and type.

    However, there's kind of trick to resolve the matter:

    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
    

    -as you can see, this query relies on fact, that quantity always goes first (so CAST will extract exactly it, therefore, it can be used to get interval length after this). But in any case, you'll have to recount all possible interval types in CASE clause

    Another good idea would be - to store your period in unified form (for example, always in days) - so you'll store only one number for each row (thus, 1 week=7days, e t.c.)

提交回复
热议问题