MySQL 数据库 DATE_SUB 函数计算工作日天数实战

MySQL 数据库阿木 发布于 2025-07-08 11 次阅读


使用MySQL DATE_SUB 函数计算工作日天数的实战教程

在数据处理和业务分析中,计算两个日期之间的工作日天数是一个常见的需求。MySQL 数据库提供了丰富的日期和时间函数,其中 DATE_SUB 函数可以用来从日期中减去指定的时间间隔。本文将围绕 DATE_SUB 函数,结合实际案例,讲解如何计算两个日期之间的工作日天数。

前提条件

在开始之前,请确保您已经:

1. 安装并配置了MySQL数据库。

2. 创建了一个用于演示的数据库和表。

3. 熟悉基本的SQL语句。

准备工作

创建数据库和表

我们需要创建一个数据库和一个表来存储日期数据。

sql

CREATE DATABASE IF NOT EXISTS workday_calculator;


USE workday_calculator;

CREATE TABLE IF NOT EXISTS workdays (


id INT AUTO_INCREMENT PRIMARY KEY,


start_date DATE,


end_date DATE


);


插入示例数据

接下来,我们向 `workdays` 表中插入一些示例数据。

sql

INSERT INTO workdays (start_date, end_date) VALUES


('2023-01-01', '2023-01-10'),


('2023-01-15', '2023-01-24'),


('2023-02-01', '2023-02-10');


DATE_SUB 函数简介

DATE_SUB 函数用于从日期或日期时间值中减去指定的时间间隔。其语法如下:

sql

DATE_SUB(date, INTERVAL interval_type interval_value)


其中,`date` 是要减去时间间隔的日期或日期时间值,`interval_type` 是时间间隔的类型(如 YEAR、MONTH、DAY、HOUR 等),`interval_value` 是要减去的时间间隔值。

计算工作日天数

1. 计算两个日期之间的工作日天数

假设我们要计算 '2023-01-01' 到 '2023-01-10' 之间的工作日天数,我们可以使用以下SQL语句:

sql

SELECT


start_date,


end_date,


DATEDIFF(end_date, start_date) + 1 - COUNT(DISTINCT CASE WHEN DAYOFWEEK(date) BETWEEN 2 AND 6 THEN date END) AS workdays


FROM


workdays


WHERE


start_date = '2023-01-01' AND end_date = '2023-01-10'


GROUP BY


start_date, end_date;


解释:

- `DATEDIFF(end_date, start_date) + 1` 计算两个日期之间的总天数,包括开始和结束日期。

- `COUNT(DISTINCT CASE WHEN DAYOFWEEK(date) BETWEEN 2 AND 6 THEN date END)` 计算工作日天数,其中 `DAYOFWEEK(date)` 返回日期是一周中的第几天(1 表示周日,2 表示周一,以此类推)。我们只计算周一到周五的天数。

- `GROUP BY start_date, end_date` 对结果进行分组,以便为每个日期范围计算工作日天数。

2. 计算多个日期范围的工作日天数

如果我们有多个日期范围,我们可以使用以下SQL语句:

sql

SELECT


start_date,


end_date,


DATEDIFF(end_date, start_date) + 1 - COUNT(DISTINCT CASE WHEN DAYOFWEEK(date) BETWEEN 2 AND 6 THEN date END) AS workdays


FROM


workdays


GROUP BY


start_date, end_date;


这个查询将计算 `workdays` 表中所有日期范围的工作日天数。

实战案例

案例一:计算项目周期内的工作日天数

假设我们正在跟踪一个项目,项目开始日期为 '2023-01-01',结束日期为 '2023-01-31'。我们需要计算项目周期内的工作日天数。

sql

SELECT


'2023-01-01' AS project_start_date,


'2023-01-31' AS project_end_date,


DATEDIFF('2023-01-31', '2023-01-01') + 1 - COUNT(DISTINCT CASE WHEN DAYOFWEEK(date) BETWEEN 2 AND 6 THEN date END) AS workdays


FROM


(SELECT '2023-01-01' AS date


UNION ALL SELECT DATE_ADD('2023-01-01', INTERVAL 1 DAY)


UNION ALL SELECT DATE_ADD('2023-01-01', INTERVAL 2 DAY)


-- ... 添加所有日期 ...


UNION ALL SELECT '2023-01-31') AS dates


WHERE


DAYOFWEEK(date) BETWEEN 2 AND 6;


案例二:计算员工请假期间的工作日天数

假设我们有一个员工请假,请假开始日期为 '2023-02-01',结束日期为 '2023-02-10'。我们需要计算请假期间的工作日天数。

sql

SELECT


'2023-02-01' AS leave_start_date,


'2023-02-10' AS leave_end_date,


DATEDIFF('2023-02-10', '2023-02-01') + 1 - COUNT(DISTINCT CASE WHEN DAYOFWEEK(date) BETWEEN 2 AND 6 THEN date END) AS workdays


FROM


(SELECT '2023-02-01' AS date


UNION ALL SELECT DATE_ADD('2023-02-01', INTERVAL 1 DAY)


UNION ALL SELECT DATE_ADD('2023-02-01', INTERVAL 2 DAY)


-- ... 添加所有日期 ...


UNION ALL SELECT '2023-02-10') AS dates


WHERE


DAYOFWEEK(date) BETWEEN 2 AND 6;


总结

本文通过实际案例,讲解了如何使用MySQL的 DATE_SUB 函数和 DAYOFWEEK 函数来计算两个日期之间的工作日天数。通过这些函数,我们可以轻松地处理各种日期相关的计算问题,为业务分析和数据处理提供有力支持。