2013-03-15 81 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]

相關問題