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

SQL中如何将含月份缩写的字符串日期转为数字月份格式?

解决日期字符串转换问题:英文月份缩写转数字并转换为datetime2类型

问题分析

你的日期字符串格式为15-JUN-22 10.24.10.414000,转换失败的核心原因有两个:

  1. 月份是英文缩写(JUN),而非数字,默认的TRY_CAST/TRY_CONVERT无法自动识别;
  2. 时间部分用点分隔小时/分钟/秒(10.24.10),不符合SQL Server默认的时间分隔规则(冒号:)。

以下是两种可行的解决方案:


方法一:直接解析(推荐,代码更简洁)

使用TRY_PARSE函数,指定英语语言解析英文月份缩写,同时修正时间部分的分隔符:

SELECT 
    TRY_PARSE(
        -- 将时间部分的前两个点替换为冒号,转为标准时间格式
        STUFF(STUFF(CREATE_DATE, CHARINDEX(' ', CREATE_DATE)+3, 1, ':'), CHARINDEX(' ', CREATE_DATE)+6, 1, ':')
        AS DATETIME2(7) USING 'en-US'
    ) AS CREATE_DATE
FROM your_table;

说明:

  • STUFF函数用于精准替换字符:第一个替换小时后的点为冒号,第二个替换分钟后的点为冒号,将10.24.10.414000转为10:24:10.414000;
  • TRY_PARSE结合USING 'en-US'可以直接识别英文月份缩写,无需手动映射。

方法二:手动映射月份缩写后转换

如果SQL Server版本不支持PARSE,可以手动将所有英文月份缩写替换为数字,再修正时间分隔符后转换:

SELECT 
    TRY_CONVERT(DATETIME2(7),
        STUFF(STUFF(
            -- 依次替换12个月份的英文缩写为两位数字
            REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                    CREATE_DATE,
                    'JAN', '01'), 'FEB', '02'), 'MAR', '03'), 'APR', '04'), 'MAY', '05'), 'JUN', '06'),
                    'JUL', '07'), 'AUG', '08'), 'SEP', '09'), 'OCT', '10'), 'NOV', '11'), 'DEC', '12'),
            CHARINDEX(' ', CREATE_DATE)+3, 1, ':'), -- 替换小时后的点为冒号
            CHARINDEX(' ', CREATE_DATE)+6, 1, ':'  -- 替换分钟后的点为冒号
        )
    ) AS CREATE_DATE
FROM your_table;

为什么之前的语句失败?

  • TRY_CAST(CREATE_DATE AS DATETIME2(7)):默认解析规则不支持英文月份缩写和点分隔的时间格式,无法识别;
  • TRY_CONVERT(DATETIME2, [INTERVAL_START_DATE], 103):格式代码103对应dd/mm/yyyy,与你的dd-MMM-yy格式完全不匹配,导致转换失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:12:22