如何为日期INT补前导0并将MMDDYYYY转换为YYYYDDMM格式
要把补完前导0的MMDDYYYY格式字符串转成YYYYMMDD,核心是拆分字符串的年、月、日部分再重组,同时可以加日期有效性验证避免无效数据。
直接可用的完整SQL(更易读版本)
WITH FormattedDates AS ( SELECT RIGHT('0' + CAST(s.TestColumn AS VARCHAR(8)), 8) AS MMDDYYYY, s.OriginalColumn FROM [database].[schema].[table] s ) SELECT MMDDYYYY, -- 重组为YYYYMMDD格式的字符串 CONCAT(RIGHT(MMDDYYYY, 4), LEFT(MMDDYYYY, 2), SUBSTRING(MMDDYYYY, 3, 2)) AS YYYYMMDD, -- 可选:验证日期合法性,无效日期返回NULL TRY_CONVERT(DATE, MMDDYYYY, 110) AS ValidatedDate, OriginalColumn FROM FormattedDates
代码说明
- CTE部分先把原始INT日期补前导0,得到8位
MMDDYYYY格式字符串 CONCAT函数拆分重组逻辑:RIGHT(MMDDYYYY, 4)取最后4位作为年份LEFT(MMDDYYYY, 2)取前2位作为月份SUBSTRING(MMDDYYYY, 3, 2)取第3-4位作为日期- 拼接后直接得到
YYYYMMDD格式
TRY_CONVERT(DATE, MMDDYYYY, 110)用110格式(MM-DD-YYYY)转成日期类型,遇到02302018这类无效日期会返回NULL,方便排查异常数据
单查询精简版本
如果不想用CTE,也可以写成单语句形式:
SELECT RIGHT('0' + CAST(s.TestColumn AS VARCHAR(8)), 8) AS Original8Digit, CONCAT( RIGHT(RIGHT('0' + CAST(s.TestColumn AS VARCHAR(8)), 8), 4), LEFT(RIGHT('0' + CAST(s.TestColumn AS VARCHAR(8)), 8), 2), SUBSTRING(RIGHT('0' + CAST(s.TestColumn AS VARCHAR(8)), 8), 3, 2) ) AS YYYYMMDD, TRY_CONVERT(DATE, RIGHT('0' + CAST(s.TestColumn AS VARCHAR(8)), 8), 110) AS ValidatedDate, s.OriginalColumn FROM [database].[schema].[table] s
测试下来,7312018会先转成07312018,最终输出20180731;11252014会输出20141125,完全符合需求。
内容的提问来源于stack exchange,提问作者Thatguywes
相关产品推荐
相关产品推荐

