2011-06-21 40 views
1

我有兩個日期,想知道有多少個工作日(週一至週五),有在T-SQL 2日期間工作日

例如歸來數

thu jan 1 20xx  
fri jan 2 20xx  
sat jan 3 20xx  
sun jan 4 20xx  
mon jan 5 20xx 

1月1日,1月5日將返回3

(可以忽略公衆假期)

+0

這也可以幫助你。 http://stackoverflow.com/questions/4025047/tsql-function-to-calculate-30-working-days-date-from-a-specified-date-sql-server –

+0

可能的重複[計數兩個日期之間的工作日在T - SQL](http://stackoverflow.com/questions/252519/count-work-days-between-two-dates-in-t-sql) –

+1

更有可能 - 搜索SO是垃圾,我試過大量的變化和沒有出現 –

回答

1

嘗試

DateDiff(day, @DtA, @DtB) - 2 * DateDiff(Week, @DtA, @DtB) 

這可能不完全正常工作,但可以看到的想法。稍作修改即可使用。

+0

非常優雅!不錯的一個 –

+0

這不知何故需要考慮一週中的日期和傳統方式的datediff,並在此係統下添加1到兩個日期。腦...融化... –

1

試試這個:

SET DATEFIRST 1 
DECLARE @StartDate datetime 
     ,@EndDate datetime 
SELECT @StartDate='6/21/2011' 
     ,@EndDate='6/28/2011' 
;with AllDates AS 
(
    SELECT @StartDate AS DateOf, datepart(weekday,getdate()) AS WeekDayNumber 
    UNION ALL 
    SELECT DateOf+1, datepart(weekday,DateOf+1) 
     FROM AllDates 
    WHERE DateOf<@EndDate 
) 
SELECT COUNT(*) AS WeekDayCount FROM AllDates WHERE WeekDayNumber<=5 

OUTPUT:

WeekDayCount 
------------ 
6 

(1 row(s) affected) 

如果你有一個假期表,可以參與進來,並刪除那些爲好。

編輯基於@Ross沃森評論:

SET DATEFIRST 1 
DECLARE @StartDate datetime 
     ,@EndDate datetime 
SELECT @StartDate='6/21/2011' 
     ,@EndDate='6/28/2011' 
;with AllDates AS 
(
    SELECT @StartDate AS DateOf, datepart(weekday,getdate()) AS WeekDayNumber 
    UNION ALL 
    SELECT DateOf+1, (WeekDayNumber+1) % 7 
     FROM AllDates 
    WHERE DateOf<@EndDate 
) 
SELECT COUNT(*) AS WeekDayCount FROM AllDates WHERE WeekDayNumber>0 AND WeekDayNumber<6 
--I don't like using "BETWEEN", ">", ">=", "<", and "<=" are more explicit in defining end points 

產生相同的輸出原始查詢。

+0

不錯......非常好。我喜歡遞歸。但是,除了第一天之外,您不需要制定週日。所以......「SELECT DateOf + 1,(WeekDayNumber + 1)%7」和最後的選擇是「WHERE WeekDayNumber在1和5之間」 –

+0

這對某些日期範圍不起作用。檢查週日數。週日數根據開始日期不一致。 –

+0

@ jlo-gmail,什麼日期範圍不起作用? –

0

嘗試以下操作:

DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 
SET @StartDate = '2011/06/01' 
SET @EndDate = '2011/06/31' 

SELECT 
    (DATEDIFF(dd, @StartDate, @EndDate) + 1) - 
    (DATEDIFF(wk, @StartDate, @EndDate) * 5) - 
    (
     CASE 
      WHEN DATENAME(dw, @StartDate) in 
       ('Sunday', 'Tuesday', 'Wednesday', 'Turesday', 'Saturday') 
      THEN 1 
      ELSE 0 
     END 
    ) - 
    (
     CASE 
      WHEN DATENAME(dw, @EndDate) in 
       ('Sunday', 'Tuesday', 'Wednesday', 'Turesday', 'Saturday') 
      THEN 1 
      ELSE 0 
     END 
    ) 
1

假設日期不能超過五個年半彼此(或使用master..spt_values自己tally table代替):

DECLARE @date1 datetime, @date2 datetime; 
SET @date1 = '20110901'; 
SET @date2 = '20110905'; 

SELECT COUNT(*) 
FROM (
    SELECT 
    Date = DATEADD(day, number, @date1) 
    FROM master..spt_values 
    WHERE type = 'P' 
    AND number between 0 AND DATEDIFF(day, @date1, @date2) 
) s 
WHERE DATENAME(DW, Date) NOT IN ('Saturday', 'Sunday') 
0

由於遞歸,此方法受限於約100天。這適用於我測試過的日期範圍。同樣的想法,刪除了數學和簡化:

BEGIN 
    SET DATEFIRST 1 
    DECLARE @StartDate datetime 
      ,@EndDate datetime 
    SELECT @StartDate='12/16/2015' 
      ,@EndDate='1/8/2016' 
    ;with AllDates AS 
    (
     SELECT @StartDate AS DateOf 
     UNION ALL 
     SELECT DateOf+1 
      FROM AllDates 
     WHERE DateOf<@EndDate 
    ) 
    SELECT COUNT(*) AS WeekDayCount 
     FROM 
     AllDates 
    WHERE 
     datepart(weekday,DateOf) between 1 AND 5 

    --SELECT DateOf [date], datepart(weekday,DateOf) [day] 
    --FROM 
    -- AllDates 
    --WHERE 
    -- datepart(weekday,DateOf) between 1 AND 5 
END