Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何编写带有多个DATEDIFF变量的CASE WHEN语句_Sql Server 2005_Reporting Services - Fatal编程技术网

Sql server 2005 如何编写带有多个DATEDIFF变量的CASE WHEN语句

Sql server 2005 如何编写带有多个DATEDIFF变量的CASE WHEN语句,sql-server-2005,reporting-services,Sql Server 2005,Reporting Services,对于SQL 2005中Reporting Services中的报表,我需要计算两个日期(设施开始日期、设施结束日期)之间的差值。如果设施结束日期为空,则需要在计算中使用报告参数@EndDate。但是,如果设施结束日期大于参数@EndDate,则还需要使用参数输入@EndDate。下面的代码可以正常工作,但如果facility_end_date大于参数@EndDate,它仍然在facility_start_date和facility_end_date之间计算,而不是在facility_start_

对于SQL 2005中Reporting Services中的报表,我需要计算两个日期(设施开始日期、设施结束日期)之间的差值。如果设施结束日期为空,则需要在计算中使用报告参数@EndDate。但是,如果设施结束日期大于参数@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
我不是100%清楚你期望的结果是什么。您正在计算日偏移,而不是日期偏移。使用DATEPART函数,2010年5月31日的计算结果将大于2010年6月16日。我也不知道你为什么要从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

我不太清楚你的问题和你发布的查询,但看看这是否对你有帮助..在你的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)

你知道表格别名吗?这有助于提高查询的可读性。您意识到,您实际上并不是在计算日期差,而是在计算日差。一旦您跨越一个月的边界,此代码将出现问题。请编辑以使代码可读-ish.Removed VB.Net标记,因为这似乎不是一个VB.Net问题。感谢您的回答。我正在计算日期之间的天数。我确实知道表别名,可能应该使用这些别名。我只是复制了我正在使用的代码。我使用的是SELECT语句中的WHEN语句,因此该语句中可能存在不允许正确计算的情况。根据Kenneth的代码,如果设施结束日期晚于参数@EndDate,我仍然无法得到正确的计算结果。它计算设施开始日期和结束日期之间的天数。古拉夫的回答给了我一个函数参数计数错误。不管怎样,谢谢。这就是最终对我起作用的代码:如果t1.end_date为空,那么DATEDIFF(day,t1.start_date,@EndDate)如果t1.end_date>@EndDate,那么DATEDIFF(d,t1.start_date,@EndDate)或者DATEDIFF(d,t1.start_date,t1.end_date)结束Kenneth,谢谢你向我展示了我的代码是如何变得更短、更简洁。感谢Mark让我知道如何使用表别名使问题更清楚。我感谢你的积极反馈。
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)