2016-06-29 1 views
0

Мне нужно изменить хранимую процедуру, и я не могу понять, как день манипулирует этими датами в предложении WHERE. Особенно, когда END = 1. Я никогда этого не видел.Может кто-нибудь помочь мне перевести инструкцию CASE с датами?

CASE WHEN @DateFrom IS NULL THEN 1 ELSE 
         CASE WHEN INV.InvoiceDate > INV.EffectiveDate THEN 
          CASE WHEN dateDiff(d, @DateFrom, INV.InvoiceDate) >= 0 
           AND dateDiff(d, @DateTo, INV.InvoiceDate) <= 0 Then 1 else 0 end 
         ELSE 
          CASE WHEN dateDiff(d, @DateFrom, INV.EffectiveDate) >= 0 
           AND dateDiff(d, @DateTo, INV.EffectiveDate) <= 0 Then 1 else 0 end 
         END 
         END = 1 
+2

Это просто ряд условий, которые дают свой 'CASE' отсутствует * выражение * значение 1 или 0. После того, как все это, весь' СЛУЧАЙ, КОГДА. .... END' возвращает 0 или 1, а затем вы говорите, что вам нужны только строки, где выражение 'CASE' равно 1 – Lamak

ответ

0

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

CASE 
     WHEN @DateFrom IS NULL THEN 1 
     WHEN @DateFrom IS NOT NULL AND dateDiff(d, @DateFrom, INV.InvoiceDate) >= 0 AND dateDiff(d, @DateTo, INV.InvoiceDate) <= 0 THEN 1 
     ELSE 0 END =1 

вы могли бы попробовать это

CASE 
    WHEN @DateFrom IS NULL THEN 1 ELSE 
         (CASE 
         WHEN dateDiff(d, @DateFrom, INV.InvoiceDate) >= 0 AND dateDiff(d, @DateTo, INV.InvoiceDate) <= 0 THEN 1 ELSE 0 
         END) 
      END) 
      END = 1 

, что я клоню является второй уровень этот случай странный. случаи when и else одинаковы, поэтому их не обязательно должно быть.

(CASE 
     WHEN INV.InvoiceDate > INV.EffectiveDate 
     THEN (CASE 
        WHEN dateDiff(d, @DateFrom, INV.InvoiceDate) >= 0 AND dateDiff(d, @DateTo, INV.InvoiceDate) <= 0 THEN 1 ELSE 0 
        END) 
     ELSE (CASE 
       WHEN dateDiff(d, @DateFrom, INV.EffectiveDate) >= 0 AND dateDiff(d, @DateTo, INV.EffectiveDate) <= 0 THEN 1 ELSE 0 
       END) 
+0

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

+0

внесли некоторые изменения в ответ, но не уверен, почему он дал вам разные результаты. – Kostya

0

Это сообщение об ошибке. Я думаю, что где-то скобка

CASE 
     WHEN @DateFrom IS NULL THEN 1 ELSE 
          (CASE 
          WHEN dateDiff(d, @DateFrom, INV.InvoiceDate) >= 0 AND dateDiff(d, @DateTo, INV.InvoiceDate) <= 0 THEN 1 ELSE 0 
          END) 
       END) 
       END = 1 

enter image description here

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