【问题标题】:SQL Update varchar to date errorSQL 更新 varchar 到日期错误
【发布时间】:2009-09-02 08:16:46
【问题描述】:

我有一个表格,其中包含 500 万条日期记录,以 char(10) 格式存储,格式为 yyyy/mm/dd。我需要将这些转换为日期时间,所以我使用:

 UPDATE [Database].[dbo].[Table]
    SET [DoB]=convert(datetime,[DoBText],103)
 GO

但我得到了错误:

“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。”

现在,我已经尝试修复数据,因此不会发生这种情况 - 即没有低于 1900 或高于 2000 的“yyyy”,没有高于 30 的“dd”(2 月为 28),没有高于 12 或更低的“mm” 0. 没有 NULL。

转换仍然失败。

有什么方法可以让 SQL 在出现错误时跳过转换并继续执行?

例如类似:

  SET [DoB]= try to do [DoB]=convert(datetime,[DoBText],103) if fails SET [DoB] = NULL

谢谢 卡尔

【问题讨论】:

  • 有些月份有 31 天 - 我希望你没有破坏你的数据:S
  • 另外,没有月份零 - 月份应该是 1-12 包括在内。

标签: sql datetime char


【解决方案1】:

尝试以下方法:

SET DATEFORMAT YMD;

UPDATE [Database].[dbo].[Table]
SET [DoB]=[DoBText]
WHERE ISDATE( [DoBText] ) = 1

这将转换那些被识别为有效日期/时间值的值,其余的将保持原样。

【讨论】:

    【解决方案2】:

    转换样式 103 处理格式为 dd/mm/yyyy 的日期。请改用转换样式 111 来处理格式 yyyy/mm/dd。

    【讨论】:

      【解决方案3】:

      以 yyyyMMdd 格式插入日期或使用参数,您将不会遇到此问题。 或执行以下操作之一

      SET DATEFORMAT DMY
      SET DATEFORMAT MDY
      SET DATEFORMAT YMD
      SET DATEFORMAT YDM 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多