SQL中如何将含月份缩写的字符串日期转为数字月份格式?
解决日期字符串转换问题:英文月份缩写转数字并转换为datetime2类型
问题分析
你的日期字符串格式为15-JUN-22 10.24.10.414000,转换失败的核心原因有两个:
- 月份是英文缩写(
JUN),而非数字,默认的TRY_CAST/TRY_CONVERT无法自动识别; - 时间部分用点分隔小时/分钟/秒(
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
相关产品推荐
相关产品推荐

