Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 缩放检索非假日日期的时间_Sql_Sql Server_Case_Exists - Fatal编程技术网

Sql 缩放检索非假日日期的时间

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 ...

我有一个包含开始日期和结束日期的记录的表,所以我必须抓取每一个星期五开始的记录,如果任何星期五是假日,就抓取星期四,如果星期五和星期四是假日,就抓取星期三,依此类推

目前,我有两个表格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
...
日历如下所示:

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。谢谢