如何使用多个DATEDIFF变量编写CASE WHEN语句

时间:2010-06-14 19:57:42

标签: sql-server-2005 reporting-services

我需要计算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之间进行计算。任何帮助将不胜感激。

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

2 个答案:

答案 0 :(得分: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将评估为大于2010年6月16日。我也不确定你为什么从DATEDIFF的结果中减去1。如果您真的想要计算DATE差异,请使用:

   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

答案 1 :(得分:0)

我对你遇到的问题和你发布的查询不是很清楚,但看看这是否对你有帮助..在你的select语句中使用它。

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)