两个日期之间的DATEDIFF,不包括两个特定日期

时间:2016-02-11 08:41:52

标签: sql sql-server-2008

在迪拜,标准周末从周五到周六,而不是传统的周六/周日。

我正在计算两个给定日期之间的工作天数,这是我的代码;

    DATEDIFF(dd, DATEADD(hour, DATEDIFF(hh, getdate(), getutcdate()), @StartDate),
DATEADD(hour, DATEDIFF(hh, getdate(), getutcdate()), @EndDate)+1)
-
(
(DATEDIFF(wk, @StartDate, @EndDate) * 2
+(CASE WHEN DATENAME(dw, @StartDate) = 'Saturday' then 1 else 0 end)
+(CASE WHEN DATENAME(dw, @EndDate) = 'Friday' then 1 else 0 end)
))

)

然而,它正在计算错误的天数。例如; 如果开始日期 02-03-2016 且结束日期 02-06-2016 ,则返回 4 ,但应该是 2。

如果开始日期 02-03-2016 且结束日期 02-07-2016 ,则结果为 3 ,这是正确的。

1 个答案:

答案 0 :(得分:0)

下面的代码会正确计算您的示例中的工作日。如果需要,可以将其包装在标量函数中。

declare @from date, @to date;
set @from = '2016-02-03';
set @to = '2016-02-06';
with dates(date)
as
(
 select @from
union all
select dateadd(dd, 1, [date])
from dates
where [date] < @to
)
select count(*) [working days]
from (
select date, case when datename(dw, [date]) in ('Friday', 'Saturday') then 0 else 1 end as working
from dates) as dt
where dt.working = 1