You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:18:13