【问题标题】:DATEDIFF between two dates, excluding two specific days两个日期之间的 DATEDIFF,不包括两个特定日期
【发布时间】:2016-02-11 08:41:52
【问题描述】:

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

我正在尝试计算两个给定日期之间的工作日数量,这是我拥有的代码;

    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,即正确。

【问题讨论】:

  • 标记使用的 dbms。 DATEDIFF 是特定于产品的!
  • 您可以轻松地创建一个日历表,例如,每天一行和一列指示特定日期是否为工作日。针对这样的表编写查询很容易,您可以实现任何您想要的规则。

标签: sql sql-server-2008


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2013-02-05
    • 2020-09-15
    相关资源
    最近更新 更多