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

如何为日期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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:12:34