使用dateadd在CASE表达式中的奇怪行为

And*_*nek 4 sql sql-server

我在使用a的SQL语句中表达了一些奇怪的行为CASE.它可以通过以下示例重现:

SELECT
    CASE
    WHEN 1=1
        THEN 'foo'
    WHEN 1=2
        THEN (DATEADD(s, 1435586700, '01/01/1970 00:00:00'))
    WHEN 1=3
        THEN (DATEADD(s, 1435586700, '01/01/1970 00:00:00'))
    ELSE
        'bar'
    END AS result
Run Code Online (Sandbox Code Playgroud)

如果在SQL Server 2008上执行此操作,则不返回任何结果.只要您为第二个或第三个案例更改它成功,它就会返回一个值.如果您完全删除这些案例,它可以正常工作.

起初我认为DATEADD在任何情况下执行都是一个问题,并且由于传递的参数值而失败.但在我的例子中,它们是不变的,无论如何都应该有效.

这里发生了什么?

Gor*_*off 6

case是一个表达式,其类型在编译时确定.但是,直到运行时才会实际评估这些值.

通过类型转换的规则,我认为表达式将返回一个datetime.这会导致'foo''bar'值的错误- when满足条件时.