-1

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

4

3 回答 3

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
于 2013-03-15T11:43:21.033 回答
0

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

首先,一些注意事项

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

  • 世界肯定不能就什么构成公共假期达成一致,因为公共假期几乎总是被认为是非工作日。

您还没有指定如何处理这些情况,所以让我们做一些假设:

  • 周六和周日将是非工作日
  • 公众假期不计算在内

现在,在 sql 中确定特定日期是星期六还是星期日很容易,给定 a@date类型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<@endDateWHILE @currDate<=@endDate

于 2013-03-15T11:57:02.920 回答
0

我的解决方案不计算@EndDate,所以如果您需要更改它,只需在@d2 中加1。

首先,我计算从“初始”日(恰好是 1900 年 1 月 1 日,星期一)到 @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
于 2018-06-30T17:00:47.790 回答