【问题标题】:Fix datetime string in SQL Server修复 SQL Server 中的日期时间字符串
【发布时间】:2021-03-11 12:29:37
【问题描述】:

我有一个包含 43 000 000 行的表。在 datetime 列中,数据看起来是 2020.04.22T04:39:29.359,它的类型是 VARCHAR

它看起来像 ISO 格式,但有 .,对于 ISO,我需要 -。 将这些行中的值转换为日期时间的最佳方法是什么?

我的一个变种是 subst 。到-:

UPDATE table 
SET [Column 3] = REPLACE([Column 3], '.', '-');

但是我需要从最后缩短一微秒。

这个怎么剪?

或者你可以建议更真实的方法。

【问题讨论】:

  • "它的类型是VARCHAR。" 真正的问题是你为什么首先使用varchar?修复设计,修复问题。
  • 请注意DATETIMEDATETIME2 不同,它不支持以毫秒为单位的全精度,它仅精确到(如果你可以这么称呼它)3 毫秒。特别是像04:39:29.359 这样的值无法精确表示,将四舍五入为04:39:29.360。对于某些应用程序而言,这无关紧要,而对于其他应用程序而言(当必须将数据与原始数据进行比较时)。因此,虽然VARCHAR 绝对不是正确使用的类型,但DATETIME 也不一定。

标签: sql-server tsql datetime iso8601


【解决方案1】:

您可以在这里使用TRY_CONVERT,先进行一些按摩,将原始日期时间字符串转换为 SQL Server 可识别的格式:

UPDATE yourTable
SET new_dt_col = TRY_CONVERT(
                     datetime,
                     REPLACE(LEFT(dt_col, 19), '.', '-') + '.' + RIGHT(dt_col, 3)
                 );

明确地说,上面使用的替换逻辑将首先转换:

2020.04.22T04:39:29.359

进入这个:

2020-04-22T04:39:29.359

您可以自己验证以下转换是否正确:

SELECT TRY_CONVERT(datetime, '2020-04-22T04:39:29.359');

【讨论】:

    【解决方案2】:

    如果表中每一行的日期都遵循 2020.04.22T04:39:29.359 格式,您可以执行以下更新语句:

    UPDATE table 
    
    SET [Column 3] = SUBSTRING([Column 3],1,4) + '-' + SUBSTRING([Column 3],6,2) + '-' + SUBSTRING([Column 3],9,15)
    

    只修复第5个和第8个字符而不影响“。”来自微秒的字符。 之后,您应该能够转换为日期时间。

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2021-06-26
      相关资源
      最近更新 更多