Sql 缩放检索非假日日期的时间
我有一个包含开始日期和结束日期的记录的表,所以我必须抓取每一个星期五开始的记录,如果任何星期五是假日,就抓取星期四,如果星期五和星期四是假日,就抓取星期三,依此类推 目前,我有两个表格TableA用于记录和日历,以获得假期 我的桌子是这样的:Sql 缩放检索非假日日期的时间,sql,sql-server,case,exists,Sql,Sql Server,Case,Exists,我有一个包含开始日期和结束日期的记录的表,所以我必须抓取每一个星期五开始的记录,如果任何星期五是假日,就抓取星期四,如果星期五和星期四是假日,就抓取星期三,依此类推 目前,我有两个表格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 ...
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
...
日历如下所示:
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
当C.weekday=4和C.isholiday=1或C.weekday=5和C.isholiday=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
)
行号将标记每周最后一个非假日的日期,值为1。然后,您可以像加入一个表一样加入它
让我知道这是否合理。您的日历表是否完整,即2019年有365行?此外,您的预期结果与您最初的描述不符-标有“如果星期五是假日”的部分包括从星期三开始的活动,即使星期四不是假日,您能澄清一下吗?最后,您使用的是哪个版本的SQL Server?@Brian是的,它有30年的数据。我的意思是,我需要每周最后一个工作日的每一行,因此,如果周五是日历表上的假日,那么最后一个工作日将是周四,我使用的是SQL Server 2008。谢谢