You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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;

关键逻辑说明

  1. 表关联:通过课程编号关联原始授课天数表与课程段表,确保每个课程的起止时间、授课日能被获取
  2. 节假日匹配:用LEFT JOIN关联节假日表,筛选同时满足两个条件的记录:
    • 节假日日期落在课程的起止日期区间内
    • 节假日对应的星期几等于课程的授课日(DAY_TYPE)
  3. 天数计算:统计每个课程匹配到的节假日数量,用原始授课天数减去该数量,得到最终有效授课天数

示例验证

以你提到的课程390为例:

  • 原始授课天数NbrOfDays=33
  • 课程授课日为周一(DAY_TYPE=1),起止日期内有2个周一节假日
  • 查询结果中需排除的节假日数=2,调整后授课天数=33-2=31,符合预期

内容的提问来源于stack exchange,提问作者Connor Hale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:05:21