如何在SQL Server中将'Wed Jan 25 00:10:28 KST 2023'转为指定日期格式
解决SQL Server中特定格式时间字符串的转换问题
要将'Wed Jan 25 00:10:28 KST 2023'转换为'2023-01-25 00:10:28.000'格式,核心是先移除时区标识KST,再将剩余字符串转换为datetime类型,最后格式化输出。你的原代码执行失败主要有几个问题:
PATINDEX('%[A-Z][A-Z][A-Z]%')会匹配到字符串开头的Wed而非月份Jan,导致月份提取错误PATINDEX('%[0-9][0-9]%')会优先匹配时间部分的00而非日期的25,日期提取错误- 拼接日期时未处理月份/日期的单数字前导零问题,可能导致转换失败
方法一:移除时区后直接转换(SQL Server 2012+)
先通过字符串替换去掉KST,再用TRY_CONVERT配合格式代码100(对应Mon dd yyyy hh:mi:ssAM/PM格式)转换为datetime,最后用CONVERT格式化为目标样式:
DECLARE @timeStr NVARCHAR(50) = 'Wed Jan 25 00:10:28 KST 2023' -- 移除KST及前后空格 SET @timeStr = REPLACE(@timeStr, ' KST ', ' ') -- 转换为datetime并格式化为目标格式 SELECT CONVERT(NVARCHAR(23), CONVERT(DATETIME, @timeStr, 100), 121) AS FormattedDate
输出结果:2023-01-25 00:10:28.000
方法二:精准字符串截取(兼容低版本SQL Server)
如果你的SQL Server版本不支持TRY_CONVERT,可以通过固定位置截取各时间部分:
DECLARE @timeStr NVARCHAR(50) = 'Wed Jan 25 00:10:28 KST 2023' SELECT CONVERT(NVARCHAR(23), CONVERT(DATETIME, SUBSTRING(@timeStr, 21, 4) + '-' + -- 年份 CASE SUBSTRING(@timeStr, 5, 3) -- 月份转数字并补零 WHEN 'Jan' THEN '01' WHEN 'Feb' THEN '02' WHEN 'Mar' THEN '03' WHEN 'Apr' THEN '04' WHEN 'May' THEN '05' WHEN 'Jun' THEN '06' WHEN 'Jul' THEN '07' WHEN 'Aug' THEN '08' WHEN 'Sep' THEN '09' WHEN 'Oct' THEN '10' WHEN 'Nov' THEN '11' WHEN 'Dec' THEN '12' END + '-' + SUBSTRING(@timeStr, 9, 2) + ' ' + -- 日期 SUBSTRING(@timeStr, 12, 8), -- 时间 120), 121) AS FormattedDate
这种方法通过固定位置截取各部分,避免正则匹配的不确定性,兼容性更好。
方法三:使用STRING_SPLIT拆分字符串(SQL Server 2016+)
通过拆分字符串提取有效时间片段,再组合转换:
DECLARE @timeStr NVARCHAR(50) = 'Wed Jan 25 00:10:28 KST 2023' SELECT CONVERT(NVARCHAR(23), CONVERT(DATETIME, MAX(CASE WHEN idx=6 THEN value END) + '-' + -- 年份 CASE MAX(CASE WHEN idx=2 THEN value END) WHEN 'Jan' THEN '01' WHEN 'Feb' THEN '02' WHEN 'Mar' THEN '03' WHEN 'Apr' THEN '04' WHEN 'May' THEN '05' WHEN 'Jun' THEN '06' WHEN 'Jul' THEN '07' WHEN 'Aug' THEN '08' WHEN 'Sep' THEN '09' WHEN 'Oct' THEN '10' WHEN 'Nov' THEN '11' WHEN 'Dec' THEN '12' END + '-' + MAX(CASE WHEN idx=3 THEN value END) + ' ' + -- 日期 MAX(CASE WHEN idx=4 THEN value END), -- 时间 120), 121) AS FormattedDate FROM ( SELECT value, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS idx FROM STRING_SPLIT(@timeStr, ' ') WHERE value <> '' -- 过滤空字符串 ) t WHERE idx NOT IN(1,5) -- 移除星期和KST
内容的提问来源于stack exchange,提问作者Sap
相关产品推荐
相关产品推荐

