tsql - 如果 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?任何建议将不胜感激!
解决方案
正如其他人所指出的那样,它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 |
推荐阅读
- file - 如何弄清楚如何反编译 .rsc 文件?
- c# - 如何在 C# 中使用亚马逊 S3?
- javascript - 流式输入的奇怪问题
- android - 如何在一个 android studio 项目中为两种不同类型的用户提供两种不同的导航抽屉活动?
- c# - 值不能为空。ASP.NET Core 3..0 中的(参数“键”)
- firebase - 我的反应本机项目firebase模块中的问题无法识别
- arrays - Postgres - 无法在 UUID 上加入 Json 数组值
- java - 为什么分配单个 2D 数组比分配具有相同总大小和形状的多个 1D 数组的循环花费更长的时间?
- create-react-app - 为什么运行创建反应应用程序时会出现盖茨比浏览器错误?
- ruby-on-rails - 参考 CarrierWave 的官方文档,但图片未显示