抱歉,如果这是一个简单的 . 我正在寻求以下方面的帮助:
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 回答
我建议一个物化日历表,每个日期有一行,以及当天所需的WorkType . 这将允许您简单地连接到日历表以确定正确的WorkType值,而无需在查询本身中嵌入逻辑 .
在此表中加载了报告域的所有日期:
查询可以重构如下:
您也可以考虑将其作为通用实用程序日历表 . 有关此类表和脚本的完整示例,请参阅http://www.dbdelta.com/calendar-table-and-datetime-functions/以加载美国假期,您可以根据需要和区域设置进行调整 .