首页 > 解决方案 > 如果 try_parse 出错,如何返回 null

问题描述

如果我从 TRY_PARSE 收到错误,我试图简单地返回 NULL。我正在使用 TRY_PARSE 从字符串中解析出日期时间。

create table #example (
    ID int identity(1, 1)
    , extractedDateTime varchar(50)
    )

insert into #example (extractedDateTime)
values ('7/19/21    11:15')
    ,('/30/21   1100')
    ,('05/15/2021       17:00')
    ,('05/03/2021       0930')
    ,('5/26/21       09:30')
    ,('05/26/2021       0930')  
    ,('06/09/2021       12:00') 
    ,('07/06/2021       13:00')
    ,('6/15/21  12:00')
    ,('07/09/2021       07:30')
    ,('07/14/2021   13:20')
    ,('/19/2021   10:30')
    ,('7/22/21   1030')
    ,('7/21/201')
    ,('06/21/21       11:00')

select exm.ID, exm.extractedDateTime, [TRY_PARSED] = TRY_PARSE(exm.extractedDateTime as datetime2 using 'en-US')
from #example as exm

drop table #example

在上面的示例中,有 ID 14: '7/21/201' 将被解析为从 201 年开始(大概是 21 或 2021)。我已经把它解析为 datetime2,最初我使用的是 datetime。我倾向于仍然使用日期时间,但我想要为该特定行返回 NULL。相反,由于当然使用了日期时间,所以会收到一条关于 SqlDateTime 溢出的冗长错误消息。

我想重新使用 datetime 的原因是这是一个不正确的值,使用 datetime 可能有助于过滤掉这样的错误值。另外,我希望查询能够返回 NULL ,只要这一点遇到错误,它就不会停止整个查询(这是更大查询的一部分)。

如何为这条记录返回 NULL?任何建议将不胜感激!

更新:这是我从执行看到的 SELECT 语句中得到的图片: 错误信息

标签: tsql

解决方案


正如其他人所指出的那样,它TRY_PARSE正在按预期运行并记录在案。不过,这对您的情况没有帮助,所以我建议设置一个任意的最小日期,在此之前的任何日期都被分配一个NULL.

示例代码:

SELECT exm.ID,
       exm.extractedDateTime,
       [TRY_PARSED] = CASE
                           WHEN TRY_PARSE(exm.extractedDateTime AS DATETIME2 USING 'en-US') < '1970-01-01'
                                THEN NULL
                           ELSE TRY_PARSE(exm.extractedDateTime AS DATETIME2 USING 'en-US')
                      END
  FROM #example AS exm;

结果:

1 21 年 7 月 19 日 11:15 2021-07-19 11:15:00.0000000
2 /30/21 1100 空值
3 2021 年 5 月 15 日 17:00 2021-05-15 17:00:00.0000000
4 2021 年 5 月 3 日 0930 空值
5 21 年 5 月 26 日 09:30 2021-05-26 09:30:00.0000000
6 2021 年 5 月 26 日 0930 空值
7 2021 年 6 月 9 日 12:00 2021-06-09 12:00:00.0000000
8 2021 年 7 月 6 日 13:00 2021-07-06 13:00:00.0000000
9 21 年 6 月 15 日 12:00 2021-06-15 12:00:00.0000000
10 2021 年 7 月 9 日 07:30 2021-07-09 07:30:00.0000000
11 2021 年 7 月 14 日 13:20 2021-07-14 13:20:00.0000000
12 /19/2021 10:30 空值
13 21 年 7 月 22 日 1030 空值
14 201 年 7 月 21 日 空值
15 21 年 6 月 21 日 11:00 2021-06-21 11:00:00.0000000

推荐阅读