You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:45:04