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 |