将 ISO 格式的字符串日期时间转换为 ANSI

Convert from string datetime in ISO format to ANSI

提问人:Colin-G-Davidson 提问时间:10/4/2023 最后编辑:Colin-G-Davidson 更新时间:10/5/2023 访问量:73

问:

我有一个 varchar 列,它以以下格式提供日期时间

yyyymmddhhmmss

为了将其存储在 datetime2 列中,我需要将其转换为 ANSI 格式

yyyy-mm-dd hh:mm:ss

我使用了一个转换函数来处理以英国格式格式格式的类似列,例如 04/10/2023 11:15:00 可以使用 CONVERT(datetime2(0),COLUMN,103) 解决。

问题是我在尝试这样做时遇到错误

SELECT TOP (5) 
       [HistoryID]
      ,[CheckedBy]
      ,[CheckedTime]
      ,CheckedTime2 = SUBSTRING(CheckedTime,1,4) + '-' + SUBSTRING(CheckedTime,5,2) + '-' + SUBSTRING(CheckedTime,7,2) + ' ' + SUBSTRING(CheckedTime,9,2) + ':' + SUBSTRING(CheckedTime,11,2) + ':'  + SUBSTRING(CheckedTime,13,2)
      --,CONVERT(datetime2(0),CheckedTime,112)  
      ,CONVERT(datetime2(0),
      SUBSTRING(CheckedTime,1,4) + '-' + SUBSTRING(CheckedTime,5,2) + '-' + SUBSTRING(CheckedTime,7,2) + ' ' + SUBSTRING(CheckedTime,9,2) + ':' + SUBSTRING(CheckedTime,11,2) + ':'  + SUBSTRING(CheckedTime,13,2)
      ,120) AS [CheckedTime3]
      ,[RevokedBy]
      ,[RevokedTime]
      ,[AnalystRef]
  FROM [staging].[AccuracyChecks]

上面生成以下内容

历史 ID 检查者 CheckedTime(检查时间) 检查时间2 检查时间3
63061C5F-0062-02056B95 1 20220825082057 2022-08-25 08:20:57 2022-08-25 08:20:57
63061C5F-0062-02056B96 1 20220825082057 2022-08-25 08:20:57 2022-08-25 08:20:57
63061CBC-0062-02056B97 1 20220825082053 2022-08-25 08:20:53 2022-08-25 08:20:53
63061CBC-0062-02056B98 1 20220825082053 2022-08-25 08:20:53 2022-08-25 08:20:53
63061E55-0062-02056B99 1 20220825082026 2022-08-25 08:20:26 2022-08-25 08:20:26

正如你所看到的,当我使用substring方法或使用substring方法转换时,它会正确生成它。

注释掉的行

CONVERT(datetime2(0),CheckedTime,112)

产生以下错误

从字符串转换日期和/或时间时转换失败。

我在文档中看到的唯一区别是样式代码 112 不包括 TIME 数据。

转换为所需格式的正确方法是什么,因为使用 SUBSTRING 方法会导致与过滤器相关的不同错误,我之前曾通过 CONVERT 函数帮助解决该错误。

虽然我怀疑这很重要,但我无法控制接收数据的格式。

sql-server 日期时间

评论

1赞 Martin Smith 10/4/2023
在 markdown 表之前添加一个额外的换行符来解决这个问题
1赞 Dan Guzman 10/4/2023
尝试在日期和时间之间指定一个“T”,而不是空格:yyyy-MM-ddTHH:mm:ss
3赞 Aaron Bertrand 10/4/2023
好吧,无论如何,我不是 MERGE 的忠实粉丝,但也许您可以使用 而不是 .但是很难想象我们如何从模糊的描述中帮助您解决问题 - 恕我直言,这应该是您的问题所关注的问题。因为无论您如何强制将存储为字符串的日期转换为日期,如果引擎在转换发生之前尝试访问该列,或者过滤器发生得太晚而无法过滤掉潜入此类列的垃圾,您仍然会卡住。TRY_CONVERT()CONVERT()
1赞 Aaron Bertrand 10/4/2023
(您应该始终记住,因为 可能发生在 .一种解决方法是使用 around expression,但同样,如果没有有关错误场景的更多详细信息,很难建议如何操作。SELECT expression FROM ... WHERE filterexpressionfilterCASE
3赞 Aaron Bertrand 10/4/2023
老实说,我首先要修复的是修复该列的数据类型。没有充分的理由将日期/时间值存储为字符串,更不用说只需要理解为日期/时间的非标准值了。即使您无法更改来自其他来源的传入格式,也可以在将其存储在表中之前对其进行操作(这就是我们经常使用临时表的原因)。CONVERT()

答:

0赞 Colin-G-Davidson 10/5/2023 #1

因此,在回答我最初的问题时,似乎没有办法以该格式样式(yyyymmddhhmmss)将CONVERT与它一起使用。

根据评论中的建议,我在暂存表中添加了一个新的 datetime2 列。使用这个新列,我更改了 SP 以使用原始 SUBSTRING 方法更新该列,仅适用于我当时正在处理的筛选记录。然后,我能够在 MERGE 语句中使用新创建的列,这避免了之前看到的操作顺序错误。