SQL Server中NULL日期比较返回NULL及查询结果类型咨询
SQL返回类型问题解答
问题背景
已知sale_jan_dt和sale_feb_dt均为datetime类型列,当s.sale_feb_dt = 2022-09-01 01:19:00.000、s.sale_jan_dt = NULL时,以下代码执行结果为NULL:
select case when s.sale_jan_dt >= s.sale_feb_dt then cast(convert(char(20), s.sale_feb_dt, 20) as datetime) else cast(convert(char(20), s.sale_jan_dt, 20) as datetime) end as min_sales_month from sales s
请问以下代码返回的是datetime类型值还是字符串?该结果需要用于日期计算:
select case when isnull(s.sale_jan_dt, '2100-12-31 23:59:59') >= s.sale_feb_dt then cast(convert(char(20), s.sale_feb_dt, 20) as datetime) else cast(convert(char(20), s.sale_jan_dt, 20) as datetime) end as min_sales_month from sales s
解答
这段代码返回的是datetime类型,完全可以直接用于日期计算。
原因如下:
- CASE表达式的结果类型由所有分支的返回类型决定,你写的两个分支里,最终都通过
cast(...) as datetime将值强制转换为datetime类型,因此整个CASE表达式的结果类型统一为datetime。 - 补充说明:
isnull(s.sale_jan_dt, '2100-12-31 23:59:59')中,由于sale_jan_dt是datetime类型,ISNULL函数会自动将字符串参数隐式转换为datetime类型,比较逻辑是成立的,但建议显式转换字符串为datetime类型,写法更规范,比如:isnull(s.sale_jan_dt, cast('2100-12-31 23:59:59' as datetime))
内容的提问来源于stack exchange,提问作者User12345
相关产品推荐
相关产品推荐

