Sql 截止日期('14-09-2020 12:00:00','dd-mm yyyy hh24:mi:ss'))从“系统”“双”开始的“工作分钟数”嘿@GMB,很好的解决方案!我从13-09-2020…一直测试到14-09-2020,函数返回0选择“RAFAEL_
Sql 截止日期('14-09-2020 12:00:00','dd-mm yyyy hh24:mi:ss'))从“系统”“双”开始的“工作分钟数”嘿@GMB,很好的解决方案!我从13-09-2020…一直测试到14-09-2020,函数返回0选择“RAFAEL_,sql,oracle,datetime,recursive-query,Sql,Oracle,Datetime,Recursive Query,截止日期('14-09-2020 12:00:00','dd-mm yyyy hh24:mi:ss'))从“系统”“双”开始的“工作分钟数”嘿@GMB,很好的解决方案!我从13-09-2020…一直测试到14-09-2020,函数返回0选择“RAFAEL_LIMA”。“从”SYS.“DUAL”中选择“至日期('13-09-2020 00:00:00,'dd-mm-yyyyyyh24:mi:ss')、“至日期('14-09-2020 12:00:00,'dd-mm-yyyyyyyh24:mi:ss
截止日期('14-09-2020 12:00:00','dd-mm yyyy hh24:mi:ss'))从“系统”“双”开始的“工作分钟数”代码>嘿@GMB,很好的解决方案!我从
13-09-2020…
一直测试到14-09-2020
,函数返回0<代码>选择“RAFAEL_LIMA”。“从”SYS.“DUAL”中选择“至日期('13-09-2020 00:00:00,'dd-mm-yyyyyyh24:mi:ss')、“至日期('14-09-2020 12:00:00,'dd-mm-yyyyyyyh24:mi:ss'))“工作分钟”之间的“获取总线分钟数”代码>
CREATE OR REPLACE FUNCTION get_bus_minutes_between (start_dt DATE, end_dt DATE)
RETURN NUMBER
IS
v_return NUMBER;
BEGIN
select sum(greatest(end_dt - start_dt,0)) * 24 * 60 work_minutes
into v_return
from dual
where trunc(start_dt) - trunc(start_dt,'iw') < 5; -- exclude weekends
RETURN v_return;
END;
SELECT
"GET_BUS_MINUTES_BETWEEN"(TO_DATE('14-09-2020 06:00:00', 'dd-mm-yyyy hh24:mi:ss'),
TO_DATE('14-09-2020 10:00:00', 'dd-mm-yyyy hh24:mi:ss')) "WORK_MINUTES"
FROM
"SYS"."DUAL";
SELECT
"GET_BUS_MINUTES_BETWEEN"(TO_DATE('13-09-2020 06:00:00', 'dd-mm-yyyy hh24:mi:ss'),
TO_DATE('14-09-2020 10:00:00', 'dd-mm-yyyy hh24:mi:ss')) "WORK_MINUTES"
FROM
"SYS"."DUAL";
with cte(dt, end_dt) as (
select start_dt, end_dt from dual
union all
select dt + 1 / 24 / 60, end_dt from cte where dt < end_dt
)
select count(*) work_minutes
from cte
where trunc(dt) - trunc(dt,'iw') < 5
with cte(dt, end_dt) as (
select start_dt, end_dt from dual
union all
select dt + 1 / 24 / 60, end_dt from cte where dt < end_dt
)
select count(*) work_minutes
from cte
where to_char(dt, 'IW') <= 5
with
params (start_dt, end_dt) as (
select start_dt, end_dt from dual
)
minutes (mi) as (
select 0 from dual
union all select mi + 1 from minutes where mi < 59
),
hours (hr) as (
select 0 from dual
union all select hr + 1 from hours where hr < 23
)
select count(*) work_minutes
from params p
cross join minutes m
cross join hours h
where
p.start_dt + h.hr / 24 + m.mi / 24 / 60 <= end_dt
and trunc(p.start_dt + h.hr / 24 + m.mi / 24 / 60) - trunc(p.start_dt + h.hr / 24 + m.mi / 24 / 60,'iw') < 5
| MINUTES_BETWEEN |
| --------------: |
| 240 |
| MINUTES_BETWEEN |
| --------------: |
| 600 |