大家好,我写了一个oracle查询,它是根据8小时计算工作时间,但我想根据8.5小时的结果,有一个小的变化,但我没有得到它,请帮助。现在根据开始和结束日期,它应该返回8.5工作时间,但它是返回8小时的工作时间,请协助。
查询
with dates as (
select to_date('20-oct-2022 09:00:00','dd-mon-yyyy hh24:mi:ss') start_dt,
to_date('20-oct-2022 17:30:00','dd-mon-yyyy hh24:mi:ss') end_dt
from dual
),
-- get work hours for each date
t as (
select case level
when 1 then greatest(start_dt,trunc(start_dt) + 8 / 24)
else trunc(start_dt) + level - 16 / 24
end start_dt,
case connect_by_isleaf
when 1 then least(end_dt,trunc(end_dt) + 17 / 24)
else trunc(start_dt) + level - 7 / 24
end end_dt
from dates
connect by level <= trunc(end_dt) - trunc(start_dt) + 1
)
select sum(greatest(end_dt - start_dt,0)) * 24 work_hours
from t
where trunc(start_dt) - trunc(start_dt,'iw') < 5
1条答案
按热度按时间yshpjwxd1#
您不需要生成所有日期;您可以直接计算小时数:
其中,对于示例数据:
输出:
| 开始日期|结束日期|工作小时数差异|
| - -|- -|- -|
| 2022年10月20日09:00:00(周四)|2022年10月20日17:30:00(周四)|八点五|
| 2022年10月20日10:00:00(周四)|2022年10月21日17:30:00(法国)|十六|
| 2022年11月19日23时46分(美国夏令时)|2022年11月21日12:06:00(星期一)|三、一|
| 2022年11月18日17:30:00(法国和印度)|2022年11月21日09:00:00(周一)|第0页|
| 2022年11月19日12时26分45秒(美国夏令时)|2022年11月21日11:02:15(周一)|二点零三七五|
| 2022年11月21日11:02:15(周一)|2022年11月19日12时26分45秒(美国夏令时)| -2.0375 |
fiddle