在SQL Server中如何将时间戳字符串转换为datetime格式?
错误原因
你当前的转换逻辑返回异常值,核心是两个问题:
- 没有兼容两种不同长度的时间戳格式,
SUBSTRING截取位置与字符串结构不匹配,导致截取结果错位 - 直接用
SUBSTRING分段拼接的方式没有考虑月、日的位数浮动(比如月份可能是1位也可能是2位),进一步加剧了拼接结果异常
转换实现方案
首先先明确你给出的两种时间戳结构:
- 15位长字符串
20210926084711140:结构为yyyyMMddHHmmssfff(4位年+2位月+2位日+2位时+2位分+2位秒+3位毫秒) - 12位短字符串
926084711140:结构为MddHHmmssfff(1~2位月+2位日+2位时+2位分+2位秒+3位毫秒),缺少年份前缀,按你的示例默认补2021,可根据实际业务调整年份取值。
通用转换代码
SELECT CASE -- 适配15位完整时间戳 WHEN LEN(CAST(th.edit_timestamp AS VARCHAR(50))) = 15 THEN CONVERT(DATETIME, STUFF(STUFF(STUFF(STUFF(STUFF(CAST(th.edit_timestamp AS VARCHAR(50)), 5, 0, '-'), 8, 0, '-'), 11, 0, ' '), 14, 0, ':'), 17, 0, ':'), 121) -- 适配12位缺少年份的时间戳 WHEN LEN(CAST(th.edit_timestamp AS VARCHAR(50))) = 12 THEN CONVERT(DATETIME, '2021-' + STUFF(STUFF(STUFF(STUFF(STUFF(RIGHT('0' + CAST(th.edit_timestamp AS VARCHAR(50)), 13), 3, 0, '-'), 6, 0, ' '), 9, 0, ':'), 12, 0, ':')), 121) END AS converted_datetime FROM your_table_name th
代码说明
- 使用时将
your_table_name替换为你的实际表名即可 - 先通过
LEN判断时间戳长度,自动适配两种格式 - 用
STUFF函数替代多次SUBSTRING拼接,在指定位置直接插入日期分隔符-、时间分隔符空格和:,避免截取错位问题 - 格式码
121对应SQL Server标准的yyyy-MM-dd HH:mm:ss.fff日期解析规则,转换成功率更高 - 12位时间戳处理时用
RIGHT('0' + 字符串, 13)补位,统一把1位月份转为2位,避免位数浮动导致的解析错误 - 如果你要补的年份不是固定2021,可以根据业务逻辑替换代码中的
'2021-'部分,比如取其他字段的年份值即可。
内容的提问来源于stack exchange,提问作者Abhishek Raj
相关产品推荐
相关产品推荐

