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
相关产品推荐
相关产品推荐

