SQL Server中字段赋值及数值与日期时间相加获取新日期问题
嘿,我完全懂你遇到的坑——因为DESIRED TRANSIT TIME是字符串类型,直接和日期列相加时,数据库会默认把两者都转成字符串拼接,而不是做你想要的日期+天数的计算。咱们来一步步搞定这个问题:
核心思路
先根据字符串前缀提取对应的天数数值,再把这个数值转换成日期间隔,最后和原日期列相加得到新日期。
具体实现(分主流数据库)
1. 第一步:用CASE WHEN匹配前缀赋值天数
不管用哪个数据库,第一步都是通过字符串函数取前缀,再映射成对应的天数:
CASE WHEN LEFT(`DESIRED TRANSIT TIME`, 1) = 'A' THEN 10 -- 匹配以A开头的情况 WHEN LEFT(`DESIRED TRANSIT TIME`, 1) = 'C' THEN 5 -- 匹配以C开头的情况 ELSE 0 -- 可以根据需求设置其他前缀的默认值,比如0天或者NULL END AS transit_days
这里用LEFT()函数取列的第一个字符,确保只匹配前缀。
2. 第二步:将天数和原日期相加(分数据库)
不同数据库的日期加法语法略有不同,给你几个常用的例子:
MySQL/MariaDB 版本
用DATE_ADD()函数或者直接用+ INTERVAL语法:
SELECT REVISED_EX_FACTORY, `DESIRED TRANSIT TIME`, -- 直接计算新出厂日期 DATE_ADD(REVISED_EX_FACTORY, INTERVAL CASE WHEN LEFT(`DESIRED TRANSIT TIME`, 1) = 'A' THEN 10 WHEN LEFT(`DESIRED TRANSIT TIME`, 1) = 'C' THEN 5 ELSE 0 END DAY ) AS NEW_EX_FACTORY_DATE FROM your_table_name;
SQL Server 版本
用DATEADD()函数,注意参数顺序是(间隔类型, 天数, 原日期):
SELECT REVISED_EX_FACTORY, [DESIRED TRANSIT TIME], DATEADD(DAY, CASE WHEN LEFT([DESIRED TRANSIT TIME], 1) = 'A' THEN 10 WHEN LEFT([DESIRED TRANSIT TIME], 1) = 'C' THEN 5 ELSE 0 END, REVISED_EX_FACTORY ) AS NEW_EX_FACTORY_DATE FROM your_table_name;
PostgreSQL 版本
直接用+ INTERVAL语法,注意要把天数转换成间隔类型:
SELECT REVISED_EX_FACTORY, "DESIRED TRANSIT TIME", REVISED_EX_FACTORY + CASE WHEN LEFT("DESIRED TRANSIT TIME", 1) = 'A' THEN INTERVAL '10 days' WHEN LEFT("DESIRED TRANSIT TIME", 1) = 'C' THEN INTERVAL '5 days' ELSE INTERVAL '0 days' END AS NEW_EX_FACTORY_DATE FROM your_table_name;
额外提醒
- 如果
REVISED_EX_FACTORY列不是日期类型(比如存的是字符串),需要先转成日期再计算,比如MySQL里用CAST(REVISED_EX_FACTORY AS DATE),SQL Server用CONVERT(DATE, REVISED_EX_FACTORY)。 - 记得处理异常情况:比如列值为空、前缀不是A/C的情况,通过
ELSE设置合理的默认值,避免结果出现NULL。
内容的提问来源于stack exchange,提问作者user3496218
相关产品推荐
相关产品推荐

