Oracle中如何计算排除周三、周五的两日期间工作日天数?
嘿,我刚好琢磨出一个能解决你需求的方法——计算两个日期之间的有效天数,自动排除周三和周五!下面我把思路和可直接测试的代码给你,你可以直接拿去用~
核心思路
计算逻辑其实很清晰,分三步走:
- 第一步:先算出起始日到结束日之间的总天数(包含首尾两天,如果不需要包含可以自行调整)
- 第二步:统计这段时间内所有周三和周五的总数量
- 第三步:用总天数减去要排除的天数,得到最终的有效天数
可测试代码实现(Python)
我用Python的datetime模块写了一个函数,直接就能用,还处理了日期顺序颠倒的情况:
from datetime import datetime, timedelta def calculate_valid_days(start_day, end_day): # 确保起始日期不晚于结束日期 if start_day > end_day: start_day, end_day = end_day, start_day # 计算总天数(包含起始和结束日) total_days = (end_day - start_day).days + 1 # 每周固定排除2天(周三、周五),先算完整周的排除数量 full_weeks = total_days // 7 excluded_count = full_weeks * 2 # 处理剩余的不完整周的天数,检查是否有周三或周五 remaining_days = total_days % 7 for day_offset in range(remaining_days): current_day = start_day + timedelta(days=day_offset) # datetime.weekday():周一=0,周二=1,周三=2,周四=3,周五=4,周六=5,周日=6 if current_day.weekday() in (2, 4): excluded_count += 1 # 返回有效天数 return total_days - excluded_count
测试示例
你可以用下面的例子验证函数是否正确:
# 测试1:从周一到周日(7天),排除周三、周五,应该剩下5天 start_date = datetime(2024, 5, 13) # 周一 end_date = datetime(2024, 5, 19) # 周日 print(calculate_valid_days(start_date, end_date)) # 输出:5 # 测试2:从周三到周五(3天),排除2天,应该剩下1天 start_date2 = datetime(2024, 5, 15) # 周三 end_date2 = datetime(2024, 5, 17) # 周五 print(calculate_valid_days(start_date2, end_date2)) # 输出:1 # 测试3:跨两周的情况,从周一到下周一(8天),应该剩下6天 start_date3 = datetime(2024,5,13) end_date3 = datetime(2024,5,20) print(calculate_valid_days(start_date3, end_date3)) # 输出:6
如果你的需求里不需要包含结束日,只需要把total_days = (end_day - start_day).days + 1改成total_days = (end_day - start_day).days就可以啦~
内容的提问来源于stack exchange,提问作者DataPsycho
相关产品推荐
相关产品推荐

