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

Sql server 如何计算工作日中两个日期之间的差异,sql-server,Sql Server,我需要计算两个日期之间的工作日差。SQL Server中是否有用于此的内置函数?有人能举个例子说明如何做到这一点吗?下面是我快速写的一些东西。把它封装成一个函数或任何你需要的东西 declare @StartDate datetime declare @EndDate datetime declare @TotalDiff int declare @NumberOfWeekends int SET @StartDate = '3/12/2013' SET @EndDate = '3/22/2

我需要计算两个日期之间的工作日差。SQL Server中是否有用于此的内置函数?有人能举个例子说明如何做到这一点吗?

下面是我快速写的一些东西。把它封装成一个函数或任何你需要的东西

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
declare@StartDate-datetime
声明@EndDate-datetime
声明@TotalDiff int
声明@numberofint
设置@StartDate='3/12/2013'
设置@EndDate='3/22/2013'
设置@NumberOfWeekends=0
设置@TotalDiff=DATEDIFF(d、@StartDate、@EndDate)
如果@TotalDiff>7
设置@NumberOfWeekends=@TotalDiff/7
否则,如果DATEPART(dd,@EndDate)
不,SQL Server中没有任何内置函数可以直接为您提供两个日期之间的工作天数,但是有一些内置函数可以让您编写一个

首先,有几个注意事项

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

  • 全世界肯定无法就公共假日的构成达成一致,公共假日几乎总是被视为非工作日

您尚未指定如何处理这些情况,因此让我们做一些假设:

  • 周六和周日为非工作日
  • 公众假期不计算在内
现在,在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
DECLARE@startDate-DATETIME='2013-01-01'
声明@endDate DATETIME='2013-01-20'
声明@currDate DATETIME=@startDate
声明@numDays INT=0

而@currDate我的解决方案不计算@EndDate,因此如果需要更改,只需将1添加到@d2即可

首先,我计算从“初始”日(恰好是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

你能举一个例子说明这两个日期和你的预期结果吗?想把公众假期考虑在内吗?如果是这样的话,您需要一个表格来存储它们,因为它们会随着国家/地区的变化而变化。您是否意识到您已将一个给出完全错误结果的答案标记为正确答案?只需插入
2013年3月16日
2013年3月23日
作为开始和结束日期(即周六到周六)。你希望那里有多少个工作日?我希望是5天。您标记的答案给出了
7
您是对的。不过我还是得到了我需要的信息。这太简单了——只要把你的开始和结束日期改成连续的星期六,你就会得到7而不是预期的5