使用 case 语句 mysql 添加日期间隔

adding date intervals using case statement mysql

我有一个叫 purchase_hs 的 table。在那table我有一些级别的日期。

+-----------+------------+------------+------------+------------+----------------+
    | level1     | level2     | level3     | level4     | level5     | transport_mode |
    +------------+------------+------------+------------+------------+----------------+
    | 2015-02-15 | 15.02.2015 | 21.02.2015 | 19.03.2015 | 16.03.2015 | SEA            |
    | 2015-02-17 | 17.02.2015 | 17.02.2015 |            | 16.03.2015 | AIR            |
    | 2015-02-17 | 17.02.2015 | 17.02.2015 |            | 16.03.2015 | AIR            |
    | 2015-02-17 | 17.02.2015 | 17.02.2015 |            | 16.03.2015 | AIR            |
    +------------+------------+------------+------------+------------+----------------+

现在根据运输方式,我需要在级别上增加一些天数 dates.If 运输方式 = 'SEA' 需要在级别 1、级别 2 和级别 3 上增加 28 天,如果 transport_mode = 'AIR' 我需要在 level1、level2 和 level3 上增加 14 天,而剩余的 level4 和 level5 在显示时保持不变。 我正在尝试使用以下查询来获取它。但它对我不起作用。

SELECT level1,level2,level3,level4,level5,transport_mode,
CASE WHEN transport_mode = 'SEA'
THEN
DATE_ADD(level1, INTERVAL 28 DAY) level1, DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 28 DAY) level2, 
DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 28 DAY) level3
ELSE
transport_mode = 'AIR'
THEN 
DATE_ADD(level1, INTERVAL 14 DAY) level1, DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 14 DAY) level2, 
DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 14 DAY) level3
END 
FROM purchase_hs

我想要的输出是

+------------+------------+------------+------------+------------+----------------+
| level1     | level2     | level3     | level4     | level5     | transport_mode |
+------------+------------+------------+------------+------------+----------------+
| 2015-03-15 | 15.03.2015 | 2015-03-18 | 19.03.2015 | 16.03.2015 | SEA            |
| 2015-03-04 | 04.03.2015 | 04.03.2015 |            | 16.03.2015 | AIR            |
| 2015-03-04 | 04.03.2015 | 04.03.2015 |            | 16.03.2015 | AIR            |
| 2015-03-04 | 04.03.2015 | 04.03.2015 |            | 16.03.2015 | AIR            |
+------------+------------+------------+------------+------------+----------------+

那么我怎样才能实现这个输出呢?请建议我

每一列都需要一个单独的 CASE 表达式,THEN 子句中不能有多个列。此外,您不能在 ELSE 子句中放置条件,它会自动处理所有 WHEN 子句不匹配的条件。

SELECT level1,level2,level3,level4,level5,transport_mode,
    CASE WHEN transport_mode = 'SEA'
        THEN DATE_ADD(level1, INTERVAL 28 DAY)
        ELSE DATE_ADD(level1, INTERVAL 14 DAY)
    END level1,
    CASE WHEN transport_mode = 'SEA'
        THEN DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 28 DAY)
        ELSE DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 14 DAY)
    END level2,
    CASE WHEN transport_mode = 'SEA'
        THEN DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 28 DAY)
        ELSE DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 24 DAY)
    END level3
FROM purchase_hs

您可以通过使用子查询来避免所有这些重复:

SELECT level1,level2,level3,level4,level5,transport_mode,
    DATE_ADD(level1, INTERVAL inter DAY) level1,
    DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL inter DAY) level2,
    DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL inter DAY) level3
FROM (SELECT level1,level2,level3,level4,level5,transport_mode,
            CASE transport_mode
                 WHEN 'SEA' THEN 28
                 WHEN 'AIR' THEN 14
                 WHEN 'PIGEON' THEN 60
                 ELSE 90
            END inter
      FROM purchase_hs) x

您可以创建一个模板 table physical/temporary 并简单地加入两个 table 如下

您的数据

DECLARE @data AS TABLE(
level1 DATE,
level2 DATE,
level3 DATE,
level4 DATE,
level5 DATE,
mode VARCHAR(10))
INSERT INTO @data VALUES('2015-02-15','2015-02-15','2015-02-21','2015-03-19','2015-03-16','SEA')
INSERT INTO @data VALUES('2015-02-17','2015-02-17','2015-02-17',null,'2015-03-16','AIR')
INSERT INTO @data VALUES('2015-02-17','2015-02-17','2015-02-17',null,'2015-03-16','AIR')    
INSERT INTO @data VALUES('2015-02-17','2015-02-17','2015-02-17',null,'2015-03-16','AIR')    

根据您的逻辑临时模板

DECLARE @template AS TABLE(
level1 INT,
level2 INT,
level3 INT,
level4 INT,
level5 INT,
mode VARCHAR(10))
INSERT INTO @template VALUES(28,28,28,0,0,'SEA')
INSERT INTO @template VALUES(14,14,14,0,0,'AIR')

只需加入以上两项即可table

SELECT * FROM @data
SELECT * FROM @template

SELECT DATEADD(DAY,B.level1,A.level1) AS level1, 
DATEADD(DAY,B.level2,A.level2) AS level2, 
DATEADD(DAY,B.level3,A.level3) AS level3, 
DATEADD(DAY,B.level4,A.level4) AS level4, 
DATEADD(DAY,B.level5,A.level5) AS level5, 
A.mode FROM @data A INNER JOIN @template B ON A.mode = B.mode