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

如何将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]

转换逻辑:

  1. STUFF(CheckedTime,9,0,' '):在第9位插入空格,将字符串变为20220825 082057
  2. 第二次STUFF在第12位插入冒号,变为20220825 08:2057
  3. 第三次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:42:01