【问题标题】:IF "Date field" is wrong can we put default date automatically如果“日期字段”错误,我们可以自动输入默认日期吗
【发布时间】:2020-03-02 07:58:40
【问题描述】:

我自动从另一个表中获取一些数据。日期列是一个字符串。我将此列转换为日期时间。但有时日期字段类似于"01.01.0002""01.01.0202"。 发生这种情况时,我会收到此错误:

"SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 9999 年 12 月 31 日晚上 11:59:59。"

是否可以在出错时使用 If 语句将日期 "1/1/1753" 作为默认日期?

【问题讨论】:

  • 尝试将日期字段更改为范围更广的DateTime2。定义见here
  • 思南,请改用DateTime2 NULL,转换后可以将某个日期之前的列更新为NULL。
  • 为什么不清理输入数据呢?如果字符串不是有效日期,请不要插入。你也可以使用TRY_CONVERT()docs.microsoft.com/en-us/sql/t-sql/functions/…

标签: sql-server if-statement


【解决方案1】:

DatetimeDatetime2 数据类型的最小值和最大值如下所示

 +-----------+-----------------------------+------------------------------+-------------------------------------------------------------------------+
    | DataType  |             MIN             |             MAX              |                                 STORAGE                                 |
    +-----------+-----------------------------+------------------------------+-------------------------------------------------------------------------+
    | Datetime  | 1753-01-01 00:00:00.000     | 12/31/9999  12:00:00 AM      | 8 bytes                                                                 |
    | Datetime2 | 0001-01-01 00:00:00.0000000 | '9999-12-31 23:59:59.9999999 | Presicion 1-2 = 6 bytes precision 3-4 = 7 bytes precision 5-7 = 8 bytes |
    +-----------+-----------------------------+------------------------------+-------------------------------------------------------------------------+

根据这些详细信息,您可以针对您的问题使用以下转换。如果TRY_CAST 不能转换 DateTime 它返回 NULL 表达式,所以我们将这个 NULL 值更改为 "1753-01-01"

SELECT TRY_CAST(ISNULL(TRY_CAST('01.01.0002' AS DATETIME), '1753-01-01') AS DATETIME) DateTime_Convert, 
       TRY_CAST('01.01.0002' AS DATETIME2) AS DateTime2_Convert;

结果:

更新的结果集

+-------------------------+-----------------------------+
|    DateTime_Convert     |      DateTime2_Convert      |
+-------------------------+-----------------------------+
| 1753-01-01 00:00:00.000 | 0002-01-01 00:00:00.0000000 |
+-------------------------+-----------------------------+

【讨论】:

  • 我不确定这是否真的是解决方案,01.01.000201.01.0202 看起来就像不需要保存的垃圾。 Datetime2 还有其他好处,但现实世界中要求日期在 1753 年之前的用例并不常见,而且听起来 OP 也没有。
  • "如果出现错误,是否可以使用 If 语句将日期 "1/1/1753" 作为默认日期" 如果这是问题,TRY_CAST 和 ISNULL 可能有助于处理此问题.所以我针对这个问题给出了两种选择。
  • 我认为此信息不正确。为什么将 '01.01.0002' 转换为 datetime2 会给出 1252-01-01 呢????
  • @CetinBasoz 你说得对。我刚刚更新了转换查询的结果集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
  • 2016-07-27
  • 1970-01-01
  • 2019-08-19
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多