计算2个日期之间的小时数,只算工作日,排除周末

 function get_hours(p_date1 date, p_date2 date) return number is
    l_return NUMBER;
    l_date1  date;
    l_date2  date;
    l_days NUMBER; --天数
    l_week_days NUMBER :=0; --周末天数
  begin
    --开始时间小于8点
    if p_date1 < trunc(p_date1) + 1 / 3 then
      l_date1 := trunc(p_date1) + 1 / 3;
      --开始时间大于17点
    elsif p_date1 > trunc(p_date1) + 17 / 24 then
      l_date1 := trunc(p_date1) + 4 / 3;
    else
      l_date1 := p_date1;
    end if;
    --当天的
    if p_date2 <= l_date1 then
      l_return := round((p_date2 - p_date1) * 24, 2);
    
      --没有超过一天
    elsif p_date2 - l_date1 < 1 then
      l_return := round((p_date2 - l_date1) * 24, 2);
      --超过一天
    else
      l_days := trunc( p_date2 - l_date1);
      for i in 1.. l_days loop
        if to_char(p_date2-i,'d') in ('1','7') then
          l_week_days := l_week_days +1;
        end if;
      end loop;
      l_return := round((floor(p_date2 - l_date1)-l_week_days) * 8 +
                        (p_date2 - (l_date1 + floor(p_date2 - l_date1))) * 24,
                        2);
    end if;
    return l_return;
  EXCEPTION
    WHEN OTHERS THEN
      return 0;
  end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Java 计算两个日期之间工作日排除法定节假日和周末,包含调休工作日)的示例代码: ```java import java.time.DayOfWeek; import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; public class WorkingDaysCalculator { public static long getWorkingDays(LocalDate startDate, LocalDate endDate, List<LocalDate> holidays, List<LocalDate> workingDays) { long workingDaysCount = 0; LocalDate date = startDate; while (date.isBefore(endDate)) { if (date.getDayOfWeek() != DayOfWeek.SATURDAY && date.getDayOfWeek() != DayOfWeek.SUNDAY && !holidays.contains(date)) { workingDaysCount++; } else if (workingDays.contains(date)) { workingDaysCount++; } date = date.plus(1, ChronoUnit.DAYS); } return workingDaysCount; } public static void main(String[] args) { LocalDate startDate = LocalDate.of(2021, 1, 1); LocalDate endDate = LocalDate.of(2021, 1, 31); List<LocalDate> holidays = new ArrayList<>(); holidays.add(LocalDate.of(2021, 1, 1)); holidays.add(LocalDate.of(2021, 1, 6)); holidays.add(LocalDate.of(2021, 1, 20)); List<LocalDate> workingDays = new ArrayList<>(); workingDays.add(LocalDate.of(2021, 1, 2)); workingDays.add(LocalDate.of(2021, 1, 3)); long workingDaysCount = getWorkingDays(startDate, endDate, holidays, workingDays); System.out.println("Number of working days between " + startDate + " and " + endDate + ": " + workingDaysCount); } } ``` 与前面的示例相比,这个示例增加了一个 `List<LocalDate> workingDays` 参数来表示调休工作日日期。在 `getWorkingDays` 方法中,我们使用 `while` 循环遍历两个日期之间的每一天,并使用 `getDayOfWeek` 方法来判断一周中的哪一天。如果这一天不是周六或周日,且不是法定节假日,则将其计为工作日;如果这一天是调休工作日,则也计为工作日。最终,我们将工作日数作为方法的返回值,并在 `main` 方法中打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值