CREATE OR REPLACE function moniter_work_time(p_bgdatetime1 in date, --开始时间
p_eddatetime1 in date, --结束时间
workorderid  in number
) return number is
min_time number(9);
v_holiday_count varchar2(400);
v_yongshi        number := 0; ----用时,单位小时
v_bgtime         char(8);
v_edtime         char(8);
v_bgdate         char(10);
v_eddate         char(10);
v_tmp_bgdatetime varchar2(50);
v_tmp_eddatetime varchar2(50);
v_midtime        number := 0; -----中午的1.5小时
v_dtime          number;
v_fishDate       date;
p_bgdatetime     DATE;
p_eddatetime         DATE;
begin
p_bgdatetime := p_bgdatetime1;
p_eddatetime := p_eddatetime1;
v_bgtime     := to_char(p_bgdatetime, 'hh24:mi:ss');
v_edtime     := to_char(p_eddatetime, 'hh24:mi:ss');
v_bgdate     := to_char(p_bgdatetime, 'yyyy-mm-dd');
v_eddate     := to_char(p_eddatetime, 'yyyy-mm-dd');
for r1 in (SELECT DEFINE_WEEK FROM JK_OFFICIAL_HOLIDAY WHERE IS_STATUS = 1) loop
if v_bgdate = r1.DEFINE_WEEK then
p_bgdatetime:= p_bgdatetime - 1;
v_bgtime := '18:00:00';
end if;
if v_eddate = r1.DEFINE_WEEK then
p_eddatetime:= p_eddatetime + 1;
v_edtime := '08:30:00';
end if;
end loop;
v_bgdate     := to_char(p_bgdatetime, 'yyyy-mm-dd');
v_eddate     := to_char(p_eddatetime, 'yyyy-mm-dd');
--挂起时间
begin
select nvl(max(sum(round(moniter_work_time_tmp(wp.pause_begin_date,nvl(wp.pause_end_date, v_fishDate),workorderid),2))),0)
INTO v_dtime
from work_order_pause wp
where wp.work_order_id = workorderid
group by wp.work_order_id;
EXCEPTION
WHEN OTHERS THEN
v_dtime := 0;
end;
begin
--去除节假日
SELECT
COUNT( 1 ) into v_holiday_count
FROM
JK_OFFICIAL_HOLIDAY jjk
WHERE
jjk.IS_STATUS = 1
AND to_date( jjk.DEFINE_WEEK, 'yyyy-mm-dd' ) BETWEEN p_bgdatetime AND p_eddatetime;
EXCEPTION
WHEN OTHERS THEN
v_holiday_count := 0;
end;

if v_bgtime <= '08:30:00' then v_bgtime := '08:30:00';
elsif v_bgtime >= '18:00:00' then    v_bgtime := '18:00:00';
end if;
if v_edtime <= '08:30:00' then v_edtime := '08:30:00';
elsif v_edtime >= '18:00:00' then v_edtime := '18:00:00';
end if;
if trunc(p_bgdatetime,'dd')=trunc(p_eddatetime,'dd')then
--同一天
v_tmp_bgdatetime := '2016-11-22 ' || v_bgtime;
v_tmp_eddatetime := '2016-11-22 ' || v_edtime;
v_yongshi := (to_date(v_tmp_eddatetime, 'yyyy-mm-dd hh24:mi:ss') - to_date(v_tmp_bgdatetime, 'yyyy-mm-dd hh24:mi:ss')) * 24;
ELSIF (trunc(p_bgdatetime,'dd') <> trunc(p_eddatetime,'dd')) THEN
--规范化时间
v_tmp_bgdatetime := v_bgdate || v_bgtime;
v_tmp_eddatetime := v_eddate || v_edtime;
v_yongshi := (to_date(v_tmp_eddatetime, 'yyyy-mm-dd hh24:mi:ss') - to_date(v_tmp_bgdatetime, 'yyyy-mm-dd hh24:mi:ss')) * 24 - (trunc(to_date(v_eddate,'yyyy-mm-dd'),'dd')- trunc(to_date(v_bgdate,'yyyy-mm-dd'),'dd'))*14.5;
end if;
min_time := round(v_yongshi * 60, 2) - v_holiday_count*9.5*60 - v_dtime;
return min_time;
EXCEPTION
WHEN OTHERS THEN
min_time := (p_eddatetime1 - p_bgdatetime1) * 60 * 24;
return min_time;
end moniter_work_time;

CREATE OR REPLACE function moniter_work_time(p_bgdatetime1 in date, --开始时间 p_eddatetime1 in date, --结束时间 worko...
–实现处理 时间 统计函数,剔除 工作 时间 ,周末和法定 节假日 由于法定 节假日 没有固定的表,需要引入 节假日 表:t_work_holiday create table T_WORK_HOLIDAY day DATE not null, isholiday VARCHAR2(1) default 'H' not null -- Add comments to the colum...
我们在之前的文章《 区分 工作日 ,你就跟我这么做 》中讲过关于 工作 时间 差的相关 计算 方法,今天我们要介绍的是如何 计算 两列日期 时间 格式数据的 工作 时间 差。 1 计算 思路 首先我们思考一下,如果不考虑 工作日 的话, 计算 两列值的 时间 差怎么 计算 呢? 按照之前文章的思路是判断开始 时间 和结束 时间 区间内日期表的行数,如果我们要改成小时,那么可以考虑把日期表扩展成小时就可以 计算 了。 想到这个,问题就转换为如何将日期表扩展为按小时的 时间 序列。这是第一种 计算 方式,这种方式公式比较简单。但是如果日期年份比较多,那么日期 时间 表行数一年.
console.log(moment().format("YYYY-MM-DD HH:mm:ss")); //当前 时间 console.log(moment().format("YYYY-MM-DD HH:mm:ss").set('hour', 18).set('minute', 0).set('second', 0)); //当前特定 时间 console.log(moment().subtract(10, "days").format("YYYY-MM-DD")); /