基于SQL Server 2016排除节假日调整课程授课天数的查询方案
SQL Server 2016 查询语句:排除节假日后的授课天数计算
前提假设
以下查询基于你描述的三个表结构,若实际表名/字段名不同,请自行替换:
- 课程段表:
CourseSections(存储课程编号、起止时间、授课日) - 节假日表:
Holidays(存储节假日日期及对应星期几) - 原始授课天数表:
OriginalClassDays(存储未排除节假日的原始授课天数)
核心查询语句
SELECT oc.SECTION_NUMBER, oc.NbrOfDays AS 原始授课天数, ISNULL(COUNT(h.DATE_VALUE), 0) AS 需排除的节假日数, oc.NbrOfDays - ISNULL(COUNT(h.DATE_VALUE), 0) AS 调整后授课天数 FROM OriginalClassDays oc JOIN CourseSections cs ON oc.SECTION_NUMBER = cs.SECTION_NUMBER LEFT JOIN Holidays h ON -- 节假日在课程起止日期范围内 h.DATE_VALUE BETWEEN CAST(cs.DATE_TIME_BEGIN AS DATE) AND CAST(cs.DATE_TIME_END AS DATE) -- 节假日的星期几与课程授课日匹配 AND h.DayOfWeek = cs.DAY_TYPE GROUP BY oc.SECTION_NUMBER, oc.NbrOfDays ORDER BY oc.SECTION_NUMBER;
关键逻辑说明
- 表关联:通过课程编号关联原始授课天数表与课程段表,确保每个课程的起止时间、授课日能被获取
- 节假日匹配:用
LEFT JOIN关联节假日表,筛选同时满足两个条件的记录:- 节假日日期落在课程的起止日期区间内
- 节假日对应的星期几等于课程的授课日(
DAY_TYPE)
- 天数计算:统计每个课程匹配到的节假日数量,用原始授课天数减去该数量,得到最终有效授课天数
示例验证
以你提到的课程390为例:
- 原始授课天数
NbrOfDays=33 - 课程授课日为周一(
DAY_TYPE=1),起止日期内有2个周一节假日 - 查询结果中
需排除的节假日数=2,调整后授课天数=33-2=31,符合预期
内容的提问来源于stack exchange,提问作者Connor Hale
相关产品推荐
相关产品推荐

