【问题标题】:How do I combine working days of a month with annual holidays in SQL?如何在 SQL 中将一个月的工作日与年假结合起来?
【发布时间】:2017-12-07 16:40:25
【问题描述】:

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

获取工作日的代码:

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 的间隔中的年假,这样我就可以得到指定间隔的实际工作日

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    一种方法是生成有效范围,然后减去假期并计算结果。我正在对日期范围使用递归函数,但有more 方法可以在更大的范围内更有效地执行此操作。

    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
    

    【讨论】:

    • 由于某种原因,没有扣除年假。它只显示工作日,即删除星期日但不删除年假..
    • 你设法让它工作了吗?你也可以...not in(select date from AnnualHolidays)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多