如何用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
相关产品推荐
相关产品推荐

