2013-05-14 45 views
0

嗨,我相信這是一個簡單的修復,但我無法弄清楚。我試圖將逾期完成日期(CompleteDate-CurrentDate)的記錄(這些數字將爲負數)標記爲報告的「過期」。我還希望記錄不要改變爲不是負數的數字。這是當前給我NULL項使用CASE函數與DATEDIFF和COUNT

Select CASE DATEDIFF(targetcompletedate, NOW()) 
     When count(*) <=0 then 'Overdue' 
    END 'Days Left', 

的代碼片段任何幫助將不勝感激 感謝

回答

3

還有的CASE兩個變種:

  1. CASE 
        WHEN condition1 THEN result1 
        WHEN condition2 THEN result2 
        ... 
        ELSE result_else 
    END 
    
  2. CASE scalar_expression 
        WHEN value1 THEN result1 
        WHEN value2 THEN result2 
        ... 
        ELSE result_else 
    END 
    

在你的情況下,它應該是第一種語法,因爲你沒有比較具體的值,而是與範圍進行比較。相反,您的查詢實際上使用第二種語法。 count(*)<=0表達式評估爲一個布爾值,然後將其隱式轉換爲一個整數,暗示了DATEDIFF結果的類型。

你只需要使用第一語法,這樣的事情:

select case when targetcompletedate is null 
      then 'Not set' 
      when DATEDIFF(targetcompletedate, NOW()) <= 0 
      then 'Overdue'     
      else DATEDIFF(targetcompletedate, NOW()) 
     end as 'Days Left' 
+0

這仍然返回NULL – 2013-05-14 19:38:42

+0

是你的'targetcompletedate'有時'null'?我更新了我的答案。 – 2013-05-14 20:46:54

2

我建議你消除datediff()完全:

Select (CASE when targetcompletedate <= NOW() the 'Overdue' else 'Days Left' end) 

如果你想顯示的東西爲數字,那麼你想要datediff()。爲了清楚起見,我會明確地轉換爲字符串:

select (case when targetcompletedate <= NOW() then 'Overdue' 
       else cast(DATEDIFF(targetcompletedate, NOW()) as varchar(255)) 
     end) 

或者,也許:

select (case when targetcompletedate <= NOW() then 'Overdue' 
       else concat(DATEDIFF(targetcompletedate, NOW()), ' days left') 
     end) 

的哲學是:如果有一個更簡單,更清晰的表達方式有什麼不使用的功能你要。

但是,我不知道你要統計每個組中的數量:

select sum(case when targetcompletedate <= NOW() then 1 else 0 end) as NumOverdue, 
     sum(case when targetcompletedate <= NOW() then 0 else 1 end) as NumWithDaysLeft 
+0

這是偉大的,但我需要其他記錄顯示爲數字不是「剩餘天數」這可能嗎? – 2013-05-14 17:53:31

-1

剛剛嘗試這個代碼:

SELECT 
    CASE 
     WHEN datediff(dd,targetcompletedate,now()) <= 0 THEN 'Overdue' 
     WHEN datediff(dd,targetcompletedate,now()) > 0 THEN 'Days_left' 
    ELSE NULL END, 
    datediff(dd,targetcompletedate,now()) AS 'days' 
FROM tablename 

輸出是這樣的:

逾期-23

Days_left 13