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

如何用SQL为单个员工存储多个假期日期范围并支持日期查询?

解决方案:拆分表结构实现多假期范围存储

1. 表结构设计

把员工基础信息和假期记录拆分到两张表,既避免数据冗余,又能支持单个员工的多个假期范围存储:

员工表(employees)

存储员工核心信息,每条记录对应一位员工:

CREATE TABLE employees (
    employeeID INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(100) NOT NULL,
    Email VARCHAR(100) NOT NULL,
    PRIMARY KEY (employeeID)
);

假期记录表(employee_vacations)

存储每个员工的假期日期范围,一条记录对应一个假期段(单日假期只需将开始和结束日期设为同一天):

CREATE TABLE employee_vacations (
    vacationID INT NOT NULL AUTO_INCREMENT,
    employeeID INT NOT NULL,
    vacation_start DATE NOT NULL,
    vacation_end DATE NOT NULL,
    PRIMARY KEY (vacationID),
    FOREIGN KEY (employeeID) REFERENCES employees(employeeID)
        ON DELETE CASCADE ON UPDATE CASCADE
);

外键关联可保证员工信息删除时,对应的假期记录同步删除,避免产生脏数据

2. 插入示例数据

按照你提供的员工假期信息,插入数据的示例如下:

先插入员工基础信息

INSERT INTO employees (Name, Email) VALUES
('Jeff', 'jeff@example.com'),
('Molly', 'molly@example.com'),
('Jane', 'jane@example.com');

再插入假期范围记录

-- Jeff的两个假期
INSERT INTO employee_vacations (employeeID, vacation_start, vacation_end) VALUES
(1, '2024-02-13', '2024-02-19'),
(1, '2024-12-05', '2024-12-07');

-- Molly的单日假期
INSERT INTO employee_vacations (employeeID, vacation_start, vacation_end) VALUES
(2, '2024-05-03', '2024-05-03');

-- Jane的三个假期
INSERT INTO employee_vacations (employeeID, vacation_start, vacation_end) VALUES
(3, '2024-01-05', '2024-01-10'),
(3, '2024-07-19', '2024-08-24'),
(3, '2024-11-14', '2024-11-23');

3. 按日期查询休假员工

比如查询2024年7月20日当天休假的所有员工,通过关联两张表并判断日期是否在假期范围内即可:

SELECT e.Name, e.Email
FROM employees e
JOIN employee_vacations v ON e.employeeID = v.employeeID
WHERE '2024-07-20' BETWEEN v.vacation_start AND v.vacation_end;

这条语句会返回Jane,因为她的7/19-8/24假期包含7/20当天。

设计优势

  • 无数据冗余:员工基础信息仅存储一次,无需在每条假期记录中重复保存
  • 扩展性强:支持任意数量的假期范围,新增/删除假期只需操作假期表
  • 查询高效:通过外键关联和日期范围判断,可快速定位目标员工

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:02:40