SQL 查询将 DATE 添加 X 个工作日,包括银行假期

问题描述 投票:0回答:1

我正在寻找将日期增加 3 个工作日的想法,包括银行假期。它必须在查询中完成,因为我们没有创建函数或过程的权限。

我们有一个带有工作日和银行假日标志的暗淡日期表。

DECLARE @DIM_DATE TABLE
(date_key date,
 work_day_flag varchar,
 bank_holiday varchar);
insert into @DIM_DATE
values
('2024-03-27','Y','N'),
('2024-03-28','Y','N'),
('2024-03-29','Y','Y'),
('2024-03-30','N','N'),
('2024-03-31','N','N'),
('2024-04-01','Y','Y'),
('2024-04-02','Y','N'),
('2024-04-03','Y','N'),
('2024-04-04','Y','N'),
('2024-04-05','Y','N'),
('2024-04-06','N','N'),
('2024-04-07','N','N'),
('2024-04-08','Y','N'),
('2024-04-09','Y','N'),
('2024-04-10','Y','N'),
('2024-04-11','Y','N'),
('2024-04-12','Y','N'),
('2024-04-13','N','N');

我当前的代码存在缺陷,因为它在非工作日和银行假日保留 NULL 值。

WITH
DAYS3 AS (
SELECT
    DATE_KEY,
    Lead(DATE_KEY, 3) OVER (
        ORDER BY
            DATE_KEY
    ) AS work_days_3_incl_bh
FROM
    @DIM_DATE
WHERE
    WORK_DAY_FLAG = 'Y'
    AND BANK_HOLIDAY = 'N'
)

SELECT  A.DATE_KEY,
    DAYS3.work_days_3_incl_bh
FROM @DIM_DATE A
LEFT JOIN DAYS3 ON A.DATE_KEY = DAYS3.DATE_KEY
ORDER BY 1; 

这是我得到的输出:-

这是我想要实现的输出:-

我真的很感谢您提供的任何帮助。

sql sql-server sql-server-2016
1个回答
0
投票

可能的解决方案 - 使用子查询:

    WITH
    DAYS3 AS (
        SELECT
            DATE_KEY,
            Lead(DATE_KEY, 3) OVER (ORDER BY DATE_KEY) AS work_days_3_incl_bh
        FROM
            DIM_DATE
        WHERE
            WORK_DAY_FLAG = 'Y'
            AND BANK_HOLIDAY = 'N'
    )
    SELECT  
        A.DATE_KEY,
        (
            SELECT TOP(1) work_days_3_incl_bh 
            FROM DAYS3 
            WHERE 
                DAYS3.DATE_KEY >= A.DATE_KEY AND
                work_days_3_incl_bh > A.DATE_KEY ORDER BY work_days_3_incl_bh
        ) work_days_3_incl_bh
    FROM DIM_DATE A
    ORDER BY 1; 

在这里测试:https://sqlize.online/s/75

© www.soinside.com 2019 - 2024. All rights reserved.