2013-03-15 135 views
-1

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

+0

你能不能给这两个日期和您预期的结果的例子吗? – 2013-03-15 11:43:55

+0

想要考虑公众假期吗?如果是这样,你需要一张表来存储他们,因为他们按国家/地区更改。 – Jamiec 2013-03-15 11:44:58

+0

你意识到你已经标记为正确的答案,它给出了完全不正确的结果?只需插入'3/16/2013'和'3/23/2013'作为开始和结束日期(即周六至周六)。你期望有多少个工作日 - 我希望是'5'。你标出的答案给出了'7' – Jamiec 2013-03-15 12:05:18

回答

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

这太简单了 - 只要将你的开始和结束日期改为连续的星期六,结果就是7而不是预期的5 – Jamiec 2013-03-15 11:48:00

0

没有,没有什么内置于SQL Server的直接给你的工作日数两个日期之间,但也有一些内置的功能,这将使你写一个。

首先,有几个注意事项

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

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

您还没有指定您希望如何处理这些情况,从而让做一些假设:

  • 周六和周日将非工作日
  • 公共假期将不被考虑acount

现在,确定是否一个特定的天是周六或周日在SQL是容易的,给定类型的@dateDateTime

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 

注:这是不可inclsive所以不会算@endDate。你可以改变它是包容性的,通过改变WHILE @currDate<@endDateWHILE @currDate<[email protected]

相关问题