2010-06-14 67 views
0

我需要計算SQL 2005中Reporting Services中報表的兩個日期(facility_start_date,facility_end_date)之間的差異。如果facility_end_date爲null,則需要使用報表參數@EndDate在計算中。但是,如果facility_end_date大於參數@EndDate,那麼它也需要使用參數@EndDate。下面的代碼工作正常,除了如果facility_end_date大於參數@EndDate,它仍然在facility_start_date和facility_end_date之間計算,而不是在facility_start_date和@EndDate之間計算。任何幫助,將不勝感激。如何使用多個DATEDIFF變量編寫CASE WHEN語句

CASE WHEN facility_start_date > facility_end_date THEN 
    NULL 
WHEN DATEPART(day , facility_start_date) > DATEPART(day , facility_end_date) THEN 
    DATEDIFF(d , facility_start_date , ISNULL(facility_end_date , @EndDate)) - 1 
WHEN DATEPART(day , .facility_end_date) > DATEPART(day , @EndDate) THEN 
    DATEDIFF(d , facility_start_date , @EndDate) - 1 
ELSE DATEDIFF(d , facility_start_date , ISNULL facility_end_date , @EndDate)) 
END 
+0

你知道表別名嗎?它可以幫助您查詢的可讀性。 – 2010-06-14 20:02:06

+1

你意識到你實際上並沒有計算DATE的差異,但是DAY的差異。一旦你跨越了一個月的邊界,這段代碼就會出現問題。編輯爲 – Kenneth 2010-06-14 20:19:44

+0

以使代碼易讀。 – Andrew 2010-06-14 20:52:04

回答

1
CASE 
    WHEN rpt_critical_info_view.facility_start_date > rpt_critical_info_view.facility_end_date 
    THEN NULL 
    WHEN rpt_critical_info_view.facility_end_date IS NULL 
      OR Datepart(DAY, rpt_critical_info_view.facility_end_date) > Datepart(DAY, @EndDate) 
    THEN Datediff(d, rpt_critical_info_view.facility_start_date, @EndDate) - 1 
    ELSE Datediff(d, rpt_critical_info_view.facility_start_date, rpt_critical_info_view.facility_end_date) 
    END 

我對你所期望的結果是不明確的100%。您正在評估DAY偏移量,而不是日期偏移量。使用DATEPART功能,05/31/2010將評估爲大於06/16/2010。我也不確定你爲什麼要從DATEDIFF的結果中減去1。如果你真正想來計算日期差異,請使用此:

CASE 
    WHEN rpt_critical_info_view.facility_start_date > rpt_critical_info_view.facility_end_date 
    THEN NULL 
    WHEN rpt_critical_info_view.facility_end_date IS NULL 
      OR rpt_critical_info_view.facility_end_date > Datepart(DAY, @EndDate) 
    THEN Datediff(d, rpt_critical_info_view.facility_start_date, @EndDate) - 1 
    ELSE Datediff(d, rpt_critical_info_view.facility_start_date, rpt_critical_info_view.facility_end_date) 
    END 
+0

感謝您的回覆。我正在計算日期之間的天數。我知道表別名,可能應該使用這些。我剛剛複製了我使用的代碼。我在SELECT語句中使用CASE WHEN語句,因此在該語句中可能存在不允許進行正確計算的內容。使用Kenneth的代碼,如果設施結束日期晚於參數@EndDate,我仍然得不到正確的計算結果。它計算設施開始和結束日期之間的天數。古拉夫的回答給了我一個函數參數計數錯誤。不管怎麼說,還是要謝謝你。 – 2010-06-16 15:38:04

+0

看看編輯。 – Kenneth 2010-06-16 16:48:17

+0

這是最終爲我工作的代碼: CASE WHEN t1.end_date IS NULL THEN DATEDIFF(日,t1.start_date,@EndDate) WHEN t1.end_date> @EndDate THEN DATEDIFF(d,T1。謝謝你向我展示我的代碼如何更短,更簡潔。謝謝你的幫助。感謝Mark讓我知道使用表別名來使問題更清楚。我讚賞積極的反饋。 – 2010-06-17 15:25:28

0

我不是你有問題,您發佈的查詢非常清晰,但看看這可能幫助you..Use這在你的選擇聲明中。

datediff(facility_start_date ,CASE WHEN facility_end_date is null 
THEN CASE WHEN facility_end_date > @EndDate THEN @EndDate ELSE @EndDate 
END ELSE facility_end_date END)