直接查节假日表比用函数判断更可靠,因MySQL无内置法定节假日识别能力,硬写逻辑易漏调休和临时假期,真实项目应建holidays表存储国务院发布的放假安排,并用BETWEEN和年份匹配查询。

直接查节假日表比用函数判断更可靠
MySQL 本身没有内置法定节假日识别能力,STR_TO_DATE()、DAYOFYEAR() 或 CURDATE() 都无法自动识别春节、国庆等浮动或公告型假期。硬写逻辑(比如“每年10月1日到7日是国庆”)会漏掉调休、临时放假、地方性假日,且维护成本极高。真实项目里,99% 的可靠做法是:建一张 holidays 表,手动或脚本同步国务院当年发布的放假安排。
建表结构要支持固定日 + 范围 + 有效年份
只存一个 date 字段不够——有些假期跨多天,有些年份调休后实际放假日期和日历不一致(如2024年五一调休后放5天,但法定假日只有1天)。建议字段包括:id、holiday_name、start_date、end_date、year、is_official(区分法定 vs 调休补班)。
示例建表语句:
CREATE TABLE holidays ( id INT PRIMARY KEY AUTO_INCREMENT, holiday_name VARCHAR(32), start_date DATE NOT NULL, end_date DATE NOT NULL, year YEAR NOT NULL, is_official TINYINT(1) DEFAULT 1 );
插入2024年春节示例:
INSERT INTO holidays (holiday_name, start_date, end_date, year, is_official)
VALUES ('春节', '2024-02-10', '2024-02-17', 2024, 1);
查询某日期是否为法定节假日的SQL写法
核心是用 BETWEEN 判断目标日期是否落在任一有效假期区间内,同时确保年份匹配(避免2023年的春节规则误判2024年1月的某天)。
- 假设要查
'2024-02-12'是否为法定节假日,SQL为: SELECT COUNT(*) > 0 AS is_holiday FROM holidays WHERE '2024-02-12' BETWEEN start_date AND end_date AND year = YEAR('2024-02-12') AND is_official = 1;- 返回
1表示是法定节假日;0表示不是 - 注意:不能只依赖
YEAR(date)做范围匹配,因为跨年假期(如2024年12月30日–2025年1月1日)需额外处理,但国内法定节假日基本不跨年,可暂不考虑 - 如果业务需要区分“放假日”和“法定假日”,把
is_official条件去掉即可查所有放假安排
容易被忽略的三个细节
一是节假日表必须定期更新——国务院通知一般提前1–2个月发布,别等到节前一周才导入;二是MySQL时区设置影响 NOW() 结果,如果应用服务器和数据库时区不一致,用 CURDATE() 可能查错年份;三是部分业务需要排除“调休上班日”,这类日期在节假日表里应单独标记 is_official = 0 并设 is_workday = 1,否则仅靠 is_official 无法覆盖补班场景。


















