2015-03-17 3 views
0

У меня есть оператор 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' 

Это дает мне ошибку на линии < и >, вы не можете использовать те, в операторах случае?

ответ

1

«Коротка рука» обозначение, что вы используете работу только с равенством - если вам нужно использовать другие операторы, вы должны включить выражение значения в предложении 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' 
0

You должны использовать 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

Эта линия:

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' 
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 
0

ваш код будет слово в среде JAVA, но в SQL вы должны указать операнд в вашем случае заявление , Либо определите его в переменной, например @myDate = GETDATE(), либо используйте функцию в этом случае: КОГДА (DATEDIFF (d, date1, GETDATE()) - (DATEDIFF (ww, date2, GetDate()) * 2) THEN ...