首页 文章

将公共假期纳入SQL代码

提问于
浏览
0

抱歉,如果这是一个简单的 . 我正在寻求以下方面的帮助:

SELECT *                        
FROM (                  
    SELECT TOP 7                
        RIGHT (CONVERT (VARCHAR, CompletedDate, 108), 8) AS Time,           
        WorkType            
            FROM Table      
                WHERE WorkType = 'WorkType1'    
                    OR DATEPART (DW, CompletedDate) IN ('7','1')
                    AND WorkType = 'WorkType2'
    ORDER BY CompletedDate DESC) Table              
ORDER BY CompletedDate ASC

每天都会运行多个事件,上面会搜索计划每天运行的最后一个事件,并在过去7天内从中抽取时间 . 这一次标志着当天活动的结束,是我追求的 Value .

事件在周末以不同的顺序运行,因此我搜索不同的WorkType . WorkType 1对于工作日是唯一的 . WorkType2在工作日和周末运行,但它不是工作日的最终事件,因此我不会搜索它 .

然而,当银行假期等公共假期发挥作用时,这种情况就会崩溃,因为他们使用周末时间 . 我仍然需要 grab 这些时间,但上面会跳过它们 . 如果我要移除或扩展DATEPART,我最终会得到每天不重复的值,这些值不会标记当天的最终作业 .

我可以对此进行哪些更改以捕获这些丢失的假期时间,而无需手动检查每个假期?如果JobType1没有在一天出现,有没有办法可以为JobType2返回一个值?

1 回答

  • 1

    我建议一个物化日历表,每个日期有一行,以及当天所需的WorkType . 这将允许您简单地连接到日历表以确定正确的WorkType值,而无需在查询本身中嵌入逻辑 .

    在此表中加载了报告域的所有日期:

    CREATE TABLE dbo.WorkTypeCalendar(
          CalendarDate date NOT NULL
            CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED
        , WorkType varchar(10) NOT NULL
    );
    GO
    

    查询可以重构如下:

    SELECT  *
    FROM    ( SELECT TOP 7
                        RIGHT(CONVERT (varchar, CompletedDate, 108), 8) AS Time
                      , WorkType
              FROM      Table1 AS t
                        JOIN WorkTypeCalendar AS c ON t.WorkType = c.WorkType
                                                      AND t.CompletedDate >= c.CalendarDate
                                                      AND t.CompletedDate < DATEADD(DAY,
                                                                  1,
                                                                  c.CalendarDate)
              ORDER BY  CompletedDate DESC
            ) Table1
    ORDER BY CompletedDate ASC
    

    您也可以考虑将其作为通用实用程序日历表 . 有关此类表和脚本的完整示例,请参阅http://www.dbdelta.com/calendar-table-and-datetime-functions/以加载美国假期,您可以根据需要和区域设置进行调整 .

相关问题