我想根据办公室ID来查询两个日期之间的自定义非工作日(某些办公室可能有星期六和星期日工作,其他办公室可能有工作)。
我有一个名为tbOfficeSchedule
的表,用于存储办公室的日程表。
我有开始日期和结束日期,我必须找出这些日期之间有多少个非工作日。
假设tbOfficeSchedule
将星期一和星期六作为办公室的非工作日。
我的开始日期为2020年5月29日-星期五,结束日期为2020年6月16日,星期二。
我希望查询计算任何两个日期(包括日期)之间的非工作日。
在上面的示例中,查询应返回6作为非工作日。
这里的一种方法是使用日历表,其中包含要考虑的范围内的所有日期。一旦有了它,您只需要简单地连接到您的办公室计划表,然后进行聚合:
SELECT
t.OfficeID,
COUNT(*) AS cnt
FROM
(
SELECT '2020-01-01' AS dt UNION ALL
SELECT '2020-01-02' UNION ALL
...
SELECT '2020-12-31' -- assuming you want to cover the entire year 2020
) d
INNER JOIN tbOfficeSchedule t
ON DAYNAME(d.dt) = t.DayOfWeek
WHERE
t.Working = 1
GROUP BY
t.OfficeID;
我用别名d
内联的子查询是“日历”表的代理,因为它保存了一堆在某个范围内的日期。除了我展示的内容外,还有许多(更好的方法)可以生成日历表,但是该主题已经在本网站上进行了深入介绍。