2014-01-16 4 views
8

Я рассмотрел множество подобных вопросов, заданных здесь и в других местах, и я не знаю, как экстраполировать то, что они говорят, на то, что мне нужно, поэтому я решил попросить мой сценарий.Использование операторов CASE в предложении WHERE

В принципе, мне нужно проверить, что дата строки до определенной даты. Дата (это предшествует мне, и я ничего не могу с этим поделать, несмотря на то, что она не нравится системе) хранится просто как одно число, которое соответствует числу дней в году. Например, 1 января 1, 1 февраля - 32 и т. Д. Итак, дата вычисляется путем добавления этого числа до 12/31 /. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я проверяю период, охватывающий Новый год, он возвращает (например) 29 декабря ЭТОГО года, а не LAST year. Я столкнулся с этим в SELECT, и оператор CASE работал нормально. Однако в предложении WHERE он работает не так, как ожидалось. В предложении where я должен проверить, чтобы убедиться, что это не выходные. (Опять же, код еще до меня, и я не могу изменить много, к сожалению)

Итак, теперь у меня есть это в предложении WHERE:

CASE 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') > '01/24/2014') THEN AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2012'), 107)) NOT IN (1,7) OR t.periodid IS NULL) 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') <= '01/24/2014') THEN AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2013'), 107)) NOT IN(1,7) OR t.periodid IS NULL)  
END 

(то есть: если дата больше, чем в последний день периода, добавьте число до двух лет назад и проверьте, не выходные дни. В противном случае добавьте его в 12/31 ПОСЛЕДНИЕ год и проверьте, не выходные ли они.)

Я думаю, что я понял, что это не так, потому что мой случай должен быть чем-то более похож:

AND X = CASE..... 

, но я понятия не имею, что поставить X в этой ситуации.

+1

«CASE» в T-SQL является ** выражением **, которое может возвращать одно из нескольких ** атомных значений ** - оно не может, однако, возвращать или обрабатывать кодовые блоки и не может возвращать половину предложения WHERE , –

ответ

7

Ваше где положение должно выглядеть примерно так, если вы хотите использовать тематическое заявление внутри него:

WHERE 
(CASE 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') > '01/24/2014') AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2012'), 107)) NOT IN (1,7) OR t.periodid IS NULL) THEN 1 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') <= '01/24/2014') AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2013'), 107)) NOT IN(1,7) OR t.periodid IS NULL) THEN 1 
    ELSE 0 
END) = 1 
5

Спасибо всем. На самом деле я, наконец, понял это, прямо перед тем, как вернуться, чтобы узнать больше ответов.

я в конечном итоге делает это:

AND 1 = 
    CASE WHEN (dateadd(dd, t.periodid, '12/31/2013') > '01/24/2014') AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2012'), 107)) NOT IN(1,7) OR t.periodid IS NULL) 
    THEN 1 
    WHEN (dateadd(dd, t.periodid, '12/31/2013') <= '01/24/2014') AND (DATEPART(DW, convert(varchar, dateadd(dd, t.periodid, '12/31/2013'), 107)) NOT IN(1,7) OR t.periodid IS NULL) 
    THEN 1 
    END 

, который, кажется, работает!

Смежные вопросы