You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL将任意年份的2月29日日期转换为2月28日?

解决SQL中批量转换2月29日为2月28日的问题

你的问题出在用字符串匹配(LIKE)日期类型字段上,直接对日期类型用LIKE '2/29%'会因为隐式格式转换导致匹配失败,所以CASE语句根本没触发修改逻辑。

正确的通用解法

不要用字符串匹配,而是用日期函数提取月份和日期来判断,这样不管年份、不管日期存储格式,都能精准识别2月29日的记录:

CASE 
    WHEN MONTH(UOS.ExpirationDate) = 2 AND DAY(UOS.ExpirationDate) = 29 THEN
        CONVERT(char(10), DATEADD(day, -1, UOS.ExpirationDate), 101)
    ELSE
        CONVERT(char(10), UOS.ExpirationDate, 101)
END AS ExpirationDate

为什么原来的写法失效?

如果UOS.ExpirationDate是date或datetime类型,数据库执行LIKE时会自动把日期转换成字符串,但转换后的格式不一定是你预期的MM/dd/yyyy(也就是CONVERT的101格式)。比如SQL Server默认的日期字符串格式可能是yyyy-MM-dd,这时候2024年2月29日会被转成2024-02-29,自然匹配不到'2/29%',导致CASE走了ELSE分支,日期没被修改。

就算你的日期字段是字符串类型,LIKE '2/29%'也可能漏掉带前导零的日期(比如'02/29/2024'),用MONTH()和DAY()函数是最稳妥的通用方案。

内容的提问来源于stack exchange,提问作者Austin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:52:11