如何将varchar类型的特定格式日期字符串转换为标准DateTime格式?
解决SQL Server中带时区的字符串日期转换问题
我明白你遇到的麻烦了——这种带星期、时区的非标准字符串日期确实容易踩坑,手动用SUBSTRING截取很容易因为日位数(1位/2位)的差异出错。下面给你两种可靠的解决方案,适配SQL Server环境:
方法1:使用PARSE + FORMAT(推荐)
PARSE函数可以直接识别这种英文格式的日期字符串(包括星期、月份缩写和EST/EDT时区),再通过FORMAT函数输出你需要的MM/DD/YYYY HH:MM:SS格式:
SELECT FORMAT(PARSE(your_date_column AS DATETIME USING 'en-US'), 'MM/dd/yyyy HH:mm:ss') AS converted_datetime FROM your_table;
补充:处理无效日期
如果你的列里可能存在格式错误的字符串,可以用TRY_PARSE避免报错,同时标记无效值:
SELECT CASE WHEN TRY_PARSE(your_date_column AS DATETIME USING 'en-US') IS NOT NULL THEN FORMAT(TRY_PARSE(your_date_column AS DATETIME USING 'en-US'), 'MM/dd/yyyy HH:mm:ss') ELSE 'Invalid date format' END AS converted_datetime FROM your_table;
方法2:手动截取后转换(兼容旧版SQL Server)
如果你的SQL Server版本不支持PARSE(比如2008及更早),可以先精准移除时区部分,再用CONVERT转换:
SELECT CONVERT(VARCHAR, CONVERT(DATETIME, LEFT(your_date_column, CHARINDEX(' ', your_date_column, LEN(your_date_column) - 8)), 109), 101) + ' ' + CONVERT(VARCHAR, CONVERT(DATETIME, LEFT(your_date_column, CHARINDEX(' ', your_date_column, LEN(your_date_column) - 8)), 109), 108) AS converted_datetime FROM your_table;
逻辑解释:
CHARINDEX(' ', your_date_column, LEN(your_date_column) - 8):精准定位时区前的空格,确保截取后保留Fri Mar 3 12:55:17 2017这种可识别的格式- 样式
109:对应SQL Server支持的带星期的日期格式,能正确解析截取后的字符串 - 样式
101输出MM/DD/YYYY日期部分,样式108输出HH:MM:SS时间部分,拼接后就是你要的目标格式
之前你用SUBSTRING失败大概率是因为没处理好日位数(1位/2位)的差异,或者没精准移除时区部分,上面的方法可以避开这些问题。
内容的提问来源于stack exchange,提问作者JC_BI




