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

Hive SQL中计算两个日期间排除周末的工作日天数

计算两个日期之间的工作日天数(排除周末)

不同数据库的实现方式略有差异,以下是主流数据库的解决方案:

MySQL

方案1:使用现成函数(MySQL 8.0.28+)

MySQL 8.0.28及以上版本提供了WORKDAY_DIFF()函数,直接返回两个日期之间的工作日天数(自动排除周六、周日):

SELECT WORKDAY_DIFF('2023-08-23', '2023-08-30') AS work_days;
-- 返回结果:5

方案2:手动计算(兼容低版本)

如果你的MySQL版本较低,用总天数减去这段时间内的周末数量,再调整首尾日期的周末情况:

SELECT
  DATEDIFF('2023-08-30', '2023-08-23')
  - 2 * (WEEK('2023-08-30') - WEEK('2023-08-23'))
  + CASE WHEN WEEKDAY('2023-08-23') >= 5 THEN 1 ELSE 0 END
  + CASE WHEN WEEKDAY('2023-08-30') >= 5 THEN 1 ELSE 0 END AS work_days;

说明:WEEKDAY()返回值0=周一、4=周五、5=周六、6=周日,通过判断首尾日期是否为周末来修正计算结果。

SQL Server

方案1:使用现成函数(SQL Server 2022+)

SQL Server 2022及以上版本新增了DATEDIFF_WORKDAY()函数,直接计算工作日天数:

SELECT DATEDIFF_WORKDAY('2023-08-23', '2023-08-30') AS work_days;
-- 返回结果:5

方案2:手动计算(兼容低版本)

低版本可以通过总天数减去周末总数,再修正首尾日期:

SELECT
  DATEDIFF(day, '2023-08-23', '2023-08-30')
  - (DATEDIFF(week, '2023-08-23', '2023-08-30') * 2)
  - CASE WHEN DATEPART(weekday, '2023-08-23') IN (1,7) THEN 1 ELSE 0 END
  - CASE WHEN DATEPART(weekday, '2023-08-30') IN (1,7) THEN 1 ELSE 0 END AS work_days;

说明:DATEPART(weekday, date)返回值1=周日、7=周六(若需统一规则,可改用DATEPART(isoww, date))。

PostgreSQL

PostgreSQL没有直接的工作日差值函数,但可以通过生成日期序列并过滤周末来计算:

SELECT COUNT(*) AS work_days
FROM generate_series('2023-08-23'::date, '2023-08-30'::date, '1 day'::interval) AS d
WHERE EXTRACT(isodow FROM d) < 6;

说明:EXTRACT(isodow FROM d)返回值1=周一、5=周五、6=周六、7=周日,过滤掉>=6的日期即可得到工作日数量。

通用自定义函数思路

如果你的数据库没有现成的工作日函数,可以编写自定义函数,核心逻辑:

  • 确保起始日期小于等于结束日期(否则取绝对值)
  • 计算两个日期之间的总天数
  • 统计这段时间内周六和周日的总数量
  • 总天数减去周末数量即为工作日天数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:57:24