运营商的CASE声明问题

时间:2015-03-17 19:34:19

标签: sql-server tsql operators case

我有一个CASE声明,我被挂断了。这只是一个简单的陈述,但使用><运算符。它不是让我在逻辑中使用它们。以下是我的发言:

case DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2)
when 1 Then 'Now'
when > 1 Then 'After'
when < 1 Then 'Tomorrow'
else 'N/A' end AS 'Status'

我在<>行上给出了错误,您是否无法在CASE语句中使用这些错误?

5 个答案:

答案 0 :(得分:3)

这一行:

DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2)

实际上需要进行每次when比较。

可能有一种方法可以使它更简洁,但是如果你使用它,它应该可以工作。

    case 
    when (DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2)) = 1 Then 'Now'
    when (DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2)) > 1 Then 'After'
    when (DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2)) < 1 Then 'Tomorrow'
    else 'N/A' 
    end AS 'Status'

答案 1 :(得分:1)

&#34;短手&#34;您使用的符号具有相等性 - 如果您需要使用其他运算符,则需要在WHEN子句中包含值表达式:

case 
   when DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2) = 1 Then 'Now'
   when DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2) > 1 Then 'After'
   when DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2) < 1 Then 'Tomorrow'
   else 'N/A' 
end AS 'Status'

答案 2 :(得分:0)

您必须使用searched CASE expression。你可以这样做:

;WITH DATA(Val) AS
(
    SELECT DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2)
    FROM YourTable
)
SELECT CASE WHEN Val = 1 THEN 'Now' 
            WHEN Val > 1 THEN 'After'
            WHEN Val < 1 THEN 'Tomorrow'
            ELSE 'N/A' END AS Val
FROM DATA;

答案 3 :(得分:0)

无需进行三次数据计算,请改用SIGN函数:

select case sign(DATEDIFF(d, date1, GETDATE()) - (DATEDIFF(ww, date2, GetDate()) * 2))
when 0 Then 'Now'
when 1 Then 'After'
when -1 Then 'Tomorrow'
else 'N/A' end AS Status

答案 4 :(得分:0)

您的代码将在JAVA环境中发声,但在SQL中,您必须在case语句中指定操作数。在变量中定义它,例如@myDate = GETDATE()或在案例中使用函数: WHEN(DATEDIFF(d,date1,GETDATE()) - (DATEDIFF(ww,date2,GetDate())* 2)那......