TRY_PARSE解析datetime出错时如何返回NULL而非抛出错误阻断查询
问题解决方案
问题本质
TRY_PARSE解析7/21/201时会按照en-US区域规则识别为公元201年7月21日,该日期属于datetime2类型的合法范围(支持0001-9999年),但传统datetime类型仅支持1753-9999年的日期,所以后续转换为datetime时会触发溢出错误。
可行方案
方案1:自定义业务日期范围校验
可以根据业务实际场景限定合法的日期范围,超出范围的解析结果直接返回NULL,灵活性最高:select exm.ID, exm.extractedDateTime, [TRY_PARSED] = CASE WHEN TRY_PARSE(exm.extractedDateTime as datetime2 using 'en-US') >= '1990-01-01' -- 可根据业务调整最小合法日期 THEN TRY_PARSE(exm.extractedDateTime as datetime2 using 'en-US') ELSE NULL END from #example as exm方案2:嵌套TRY_CAST适配datetime范围
如果最终需要返回datetime类型的结果,直接嵌套一层TRY_CAST做类型转换,转换失败自动返回NULL,无需手动写范围判断:select exm.ID, exm.extractedDateTime, [TRY_PARSED] = TRY_CAST(TRY_PARSE(exm.extractedDateTime as datetime2 using 'en-US') AS datetime) from #example as exm该方案会自动过滤所有早于1753年的日期,刚好匹配
datetime的合法范围,全程不会抛出错误中断查询。方案3:前置格式校验
可以先通过格式匹配过滤明显不符合规则的字符串,再执行解析,进一步减少非法值的误判:select exm.ID, exm.extractedDateTime, [TRY_PARSED] = CASE -- 匹配年份为2位或4位的合法格式,可根据实际场景调整规则 WHEN exm.extractedDateTime LIKE '%/[0-9][0-9]' OR exm.extractedDateTime LIKE '%/[0-9][0-9][0-9][0-9]' THEN TRY_CAST(TRY_PARSE(exm.extractedDateTime as datetime2 using 'en-US') AS datetime) ELSE NULL END from #example as exm
内容的提问来源于stack exchange,提问作者JD136
相关产品推荐
相关产品推荐

