首页 > 解决方案 > 如果“日期字段”错误,我们可以自动输入默认日期吗

问题描述

我从另一个表中自动获取一些数据。日期列是一个字符串。我将此列转换为日期时间。但有时日期字段类似于"01.01.0002"or "01.01.0202"。当它发生这样的我得到这个错误:

“SqlDateTime 溢出。必须在 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。”

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

标签: sql-serverif-statement

解决方案


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 表达式,所以我们将用“ 1753-01-01 ”更改这个NULL值

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 |
+-------------------------+-----------------------------+

推荐阅读