如何计算工作日中两个日期之间的差异

时间:2013-03-15 11:40:23

标签: sql-server

我需要计算两个日期之间工作日的差异。 SQL Server中是否有内置函数?有人可以提供一个如何做到这一点的例子吗?

3 个答案:

答案 0 :(得分:0)

这是我写的很快的内容。只需将其封装到一个函数或任何你需要的函数中。

declare @StartDate datetime
declare @EndDate datetime

declare @TotalDiff int
declare @NumberOfWeekends int

SET @StartDate = '3/12/2013'
SET @EndDate = '3/22/2013'
SET @NumberOfWeekends = 0
SET @TotalDiff = DATEDIFF(d,@StartDate, @EndDate)

If @TotalDiff > 7 
    SET @NumberOfWeekends = @TotalDiff / 7
else if DATEPART(dd, @EndDate) < DATEPART(DD, @StartDate)
    SET @NumberOfWeekends = 1

select (@TotalDiff - 2*@NumberOfWeekends) as TotalWorkDays

答案 1 :(得分:0)

不,SQL Server内置了任何内容,无法直接为您提供两个日期之间的工作日数,但是有一些内置函数可以让您编写一个。

首先,一些警告

  • 世界不能同意“工作日”是什么。对于我们大多数人来说,这是周六和周日。在中东的大部分地区,它是周五和周五。星期六(星期日是正常的工作日)

  • 世界上当然不能就什么构成公众假期达成一致,这几乎总是被视为非工作日。

您尚未指定处理这些案例的方式,因此我们做出一些假设:

  • 周六和周日将是非工作日
  • 公众假期不会被纳入帐户

现在,鉴于类型为@date的{​​{1}},确定特定日期是星期六还是星期日在sql中很容易:

DateTime

考虑到这一点,给定开始日期和结束日期,您可以从IF DATENAME(dw,@date) IN ('Saturday','Sunday') @startDate

逐步计算
@endDate

注意:这是非侵犯性的,所以不会计算DECLARE @startDate DATETIME = '2013-01-01' DECLARE @endDate DATETIME = '2013-01-20' DECLARE @currDate DATETIME = @startDate DECLARE @numDays INT = 0 WHILE @currDate<@endDate BEGIN IF DATENAME(dw,@currDate) NOT IN ('Saturday','Sunday') SET @numDays = @numDays + 1 SET @currDate = DATEADD(day,1,@currDate) END SELECT @numDays 。您可以将@endDate更改为WHILE @currDate<@endDate

,将其更改为包含

答案 2 :(得分:0)

我的解决方案不计算@EndDate,因此,如果需要更改它,只需在@ d2上加1。

首先,我计算从“初始”日期(恰好是1/1/1900,一个星期一)到@StartDate和@EndDate的天数:

DECLARE @d1 int = DATEDIFF(Day, 0, @StartDate);
DECLARE @d2 int = DATEDIFF(Day, 0, @EndDate);

然后,@ StartDate和@EndDate之间的总天数为:

@d2 - @d1

据此,我减去间隔中的周日数和周六数,每一个均以与总天数类似的差异进行计算,但现在是整周(7天)。为了得到整周数,我将整数除以7,并将“初始”天(0)表示为星期一。该间隔中的星期天数是

@d2/7 - @d1/7

而周六是

(@d2+1)/7 - (@d1+1)/7

放在一起,我的解决方案是:

DECLARE @StartDate DATETIME = '20180101'
DECLARE @EndDate DATETIME = '20180201'

DECLARE @d1 int = DATEDIFF(Day, 0, @StartDate)
DECLARE @d2 int = DATEDIFF(Day, 0, @EndDate)

SELECT @d2 - @d1 - (@d2/7 - @d1/7) - ((@d2+1)/7 - (@d1+1)/7) AS workdays