如何将yyyymmddhhmmss格式字符串转为ANSI标准datetime2格式?
正确转换yyyymmddhhmmss格式字符串为datetime2的方法
你之前用CONVERT(datetime2(0),CheckedTime,112)报错,核心原因是样式112仅对应yyyymmdd格式的纯日期字符串,而你的CheckedTime是14位的yyyymmddhhmmss(包含时分秒),SQL Server无法将带时分秒的字符串识别为纯日期格式,因此转换失败。
以下是更可靠的转换方案:
方法1:用STUFF函数格式化后直接转换(简洁高效)
STUFF可以快速在指定位置插入分隔符,把14位字符串转换成SQL Server可直接识别的日期时间格式,无需多次SUBSTRING拼接:
SELECT TOP (5) [HistoryID], [CheckedBy], [CheckedTime], -- 直接转换为datetime2类型,自动兼容格式 TRY_CONVERT(datetime2(0), STUFF(STUFF(STUFF(CheckedTime, 9, 0, ' '), 12, 0, ':'), 15, 0, ':')) AS [CheckedTime_Converted] FROM [staging].[AccuracyChecks]
转换逻辑:
STUFF(CheckedTime,9,0,' '):在第9位插入空格,将字符串变为20220825 082057- 第二次STUFF在第12位插入冒号,变为
20220825 08:2057 - 第三次STUFF在第15位插入冒号,最终变为
20220825 08:20:57
这个格式属于SQL Server默认可识别的日期时间格式,无需额外指定样式。
方法2:指定ANSI样式120转换(严格对齐标准)
如果需要明确对齐ANSI标准格式yyyy-mm-dd hh:mm:ss,可以直接把字符串处理成该格式后转换:
SELECT TOP (5) [HistoryID], [CheckedBy], [CheckedTime], CONVERT(datetime2(0), STUFF(STUFF(STUFF(STUFF(STUFF(CheckedTime, 5, 0, '-'), 8, 0, '-'), 11, 0, ' '), 14, 0, ':'), 17, 0, ':'), 120) AS [CheckedTime_Converted] FROM [staging].[AccuracyChecks]
转换逻辑:
通过多次STUFF插入-、 、:,将20220825082057直接转为2022-08-25 08:20:57,再用样式120(对应ANSI标准格式)完成转换。
解决过滤报错问题
你提到SUBSTRING方法会引发过滤错误,本质是原始数据中可能存在不符合14位格式的无效记录(比如长度不足、含非数字字符),SQL Server执行过滤时可能先对无效数据执行SUBSTRING,导致报错。
用TRY_CONVERT替代CONVERT可以彻底解决:
TRY_CONVERT遇到无法转换的字符串时会返回NULL,而非抛出错误,保证查询正常执行- 后续可筛选出转换失败的无效数据单独处理:
-- 找出转换失败的无效记录 SELECT * FROM [staging].[AccuracyChecks] WHERE TRY_CONVERT(datetime2(0), STUFF(STUFF(STUFF(CheckedTime, 9, 0, ' '), 12, 0, ':'), 15, 0, ':')) IS NULL
内容的提问来源于stack exchange,提问作者Colin-G-Davidson
相关产品推荐
相关产品推荐

