如何将一个月的工作日与SQL中的年假相结合?

时间:2017-12-07 16:40:26

标签: sql sql-server

我有一张表格,其中包含当年的公众假期清单。现在,这里的工作日是周一至周六。所以,我试图将年度假期表与我的查询联系起来,以便获得给定时间间隔(年,月,周等)的工作日列表 我有代码给了我工作日,包括星期六,但我无法减去(链接)年假。

获取工作日的代码:

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2017-12-01 10:00:00.000'
SET @EndDate = '2017-12-31 00:00:00.000'


SELECT
   (DATEDIFF(dd, @StartDate, @EndDate) + 1)
  -(DATEDIFF(wk, @StartDate, @EndDate))
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) AS WorkingDays

AnnualHolidays具有布局:

Id                  Date                                Description
----------- -----------------------                -------------------
50          2017-10-21 00:00:00.000                    Holiday 1
49          2017-10-20 00:00:00.000                    Holiday 2

那么,有没有办法可以减去@StartDate@EndDate间隔内的年假,这样我就可以获得指定时间间隔的实际工作日

1 个答案:

答案 0 :(得分:1)

一种方法是生成有效范围,然后减去假期并计算结果。我在日期范围内使用递归函数,但有http://bit.kuas.edu.tw/~8051/种方法可以在更大的范围内更有效。

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2017-12-01 10:00:00.000'
SET @EndDate = '2017-12-31 00:00:00.000'


;WITH Dates AS (
        SELECT
            [Date] = @StartDate

        UNION ALL 

        SELECT
            [Date] = DATEADD(DAY, 1, [Date])
        FROM
            Dates
        WHERE
            Date <= @EndDate
) 
SELECT COUNT(*)
from
(
    SELECT
        [Date]
    FROM
        Dates
    WHERE
        DATENAME(dw, [Date]) != 'Sunday'

    EXCEPT

    select 
        [Date] 
    from                               
        AnnualHolidays 
) tbl