缩放CASE WHEN以检索非假日日期

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

我有包含开始日期和结束日期的记录的表格,所以我必须抓住星期五开始的每条记录,如果星期五是假日,星期四,如果星期五和星期四是节假日,请到星期三等等。 。

目前我有两个表TableA的记录和Calendar来度假。

我的TableA看起来像这样:

id beg         end
--------------------------
1  11/01/2019  14/01/2019
2  10/01/2019  14/01/2019
3  09/01/2019  15/01/2019
...

日历看起来像这样:

iddate    date        weekday isholiday
---------------------------------------
20190109  09/01/2019  3       0 --0=False / 1=True
20190110  10/01/2019  4       0
20190111  11/01/2019  5       1
...

对于这两个表我使用WHERE EXISTS来获取星期五和假日条件实际显示结果:

SELECT *
FROM TableA t
WHERE EXISTS (SELECT 1
              FROM dbo.Calendar AS c
              WHERE c.date = CAST(t.BEG AS DATETIME)
                AND c.weekday = CASE
                                    WHEN (C.weekday = 5 AND C.isholiday = 0)  
                                       THEN 5 --keep friday
                                    --WHEN ((C.weekday= 4 AND C.isholiday= 1) OR (C.weekday= 5 AND C.isholiday= 1)) THEN 3 --keep wednesday / not working
                                       ELSE 4 --keep thursday
                                    END
                AND DATEPART(yyyy, T.beg) = 2019)
ORDER BY 
    CAST(INI AS [datetime])

如果星期五是假期,它会显示:

id beg         end
--------------------------
2  10/01/2019  14/01/2019
3  09/01/2019  15/01/2019

如果周五和周四是假期,则应显示:

id beg         end
--------------------------
3  09/01/2019  15/01/2019

用这个WHEN ((C.weekday= 4 AND C.isholiday= 1) OR (C.weekday= 5 AND C.isholiday= 1))扩展它只是打破了整个查询,我得到了几乎随机的日期。有什么方法可以扩展它而不会过多地扩展查询?

sql sql-server case exists
1个回答
1
投票

根据您的评论,我会使用一个公用表表达式:

;With cte_Last_Day_Of_Week
As
(
    Select 
        c.iddate
        , c.date
        , Row_Number() Over (Partition By DatePart(Week, c.date) Order By c.date Desc) As RN
    From dbo.Calendar As c
    Where c.isholiday = 0
)

Row_Number()将标记每周最后一个非假日日期的日期,其值为1。然后,您可以像对待桌子那样加入。

如果这是有道理的,请告诉我。

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