oracle计算两个日期间的工作日(根据表配置)

36 篇文章 0 订阅
28 篇文章 1 订阅

首先新增表用于配置非工作日,工作日,具体配置在程序中处理

DROP TABLE  "T_WEEKDAY";
CREATE TABLE "T_WEEKDAY" (
  "FYEAR" VARCHAR2(100 BYTE),
  "FDATE" VARCHAR2(100 BYTE) NOT NULL,
  "FFLAG" VARCHAR2(100 BYTE),
  "FWEEK" VARCHAR2(100 BYTE),
  "FTIME" VARCHAR2(100 BYTE),
  "FEMPID" VARCHAR2(255 BYTE),
  "FEMPNAME" VARCHAR2(255 BYTE),
  "CREATETIME" DATE
)
LOGGING
NOCOMPRESS
PCTFREE 10
INITRANS 1
STORAGE (
  INITIAL 65536 
  MINEXTENTS 1
  MAXEXTENTS 2147483645
  BUFFER_POOL DEFAULT
)
PARALLEL 1
NOCACHE
DISABLE ROW MOVEMENT
;
COMMENT ON COLUMN "T_WEEKDAY"."FYEAR" IS '年份';
COMMENT ON COLUMN "T_WEEKDAY"."FDATE" IS '日期';
COMMENT ON COLUMN "T_WEEKDAY"."FFLAG" IS '0-非工作日 1-工作日 ';
COMMENT ON COLUMN "T_WEEKDAY"."FWEEK" IS '星期';
COMMENT ON COLUMN "T_WEEKDAY"."FTIME" IS '工作时间,号隔开';
COMMENT ON COLUMN "T_WEEKDAY"."FEMPID" IS '维护人编号';
COMMENT ON COLUMN "T_WEEKDAY"."FEMPNAME" IS '维护人姓名';
COMMENT ON COLUMN "T_WEEKDAY"."CREATETIME" IS '维护时间';


ALTER TABLE  "T_WEEKDAY" ADD CONSTRAINT "SYS_C0026111" PRIMARY KEY ("FDATE");
 

ALTER TABLE  "T_WEEKDAY" ADD CONSTRAINT "SYS_C0026110" CHECK ("FDATE" IS NOT NULL) NOT DEFERRABLE INITIALLY IMMEDIATE NORELY VALIDATE;

插入几条数据

INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-03-16', '1', '星期三', '08:30-12:00,14:00-18:00', NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-03-18', '1', '星期五', '08:30-12:00,14:00-18:00', NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-03-22', '1', '星期二', '08:30-12:00,14:00-18:00', NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-03-25', '1', '星期五', '08:30-12:00,14:00-18:00', NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-03-29', '1', '星期二', '08:30-12:00,14:00-18:00', NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-03-31', '1', '星期四', '08:30-12:00,14:00-18:00', NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-04-05', '1', '星期二', '08:30-12:00,14:00-18:00', NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-04-07', '1', '星期四', '08:30-12:00,14:00-18:00', NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-01-22', '0', '星期六', NULL, NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));  --配置的节假日
INSERT INTO "T_WEEKDAY" VALUES ('2022', '2022-01-23', '0', '星期日', NULL, NULL, NULL, TO_DATE('2022-03-20 11:50:03', 'SYYYY-MM-DD HH24:MI:SS'));  --配置的节假日

创建函数

--计算两个日期间隔的天数,去除配置的节假日,这边计算的是工作日大于十天的
create or replace function SUMDAY(fodate in date) RETURN int IS
  V_COUNT int;
begin
  SELECT case
           when count(d.fdate) > 10 then
            1
           else
            0
         end
    into V_COUNT
    FROM t_weekday d
   where d.fflag = '1' --1为工作日,0为节假日
     and d.fdate > to_char(fodate, 'yyyy-mm-dd')
     and d.fdate <= to_char(sysdate, 'yyyy-mm-dd');
  return V_COUNT;
end;


--调用
SELECT  a.fmrdid,
sysdate, --当天
a.fodate,--出院日期
SumDay(a.fodate) days --1为大于10个工作日,0为小于10个工作日
 FROM    t_noentryquery a;

下面为计算根据FZYYSNO, FDSTYPE两个字段进行分组求两个日期间的工作日总和大于10天的,t_noentryquery 表可自行创建

SELECT a.FZYYSNO, a.FDSTYPE, count(a.days) days
  FROM (SELECT a.FZYYSNO,
               a.FDSTYPE,
               (TRUNC(sysdate, 'IW') - TRUNC(fodate, 'IW')) * 5 / 7 +
               LEAST(TRUNC(sysdate) - TRUNC(sysdate, 'IW') + 1, 5) -
               LEAST(TRUNC(fodate) - TRUNC(fodate, 'IW'), 5) AS days
          FROM t_noentryquery a) a
 where a.days > 10
 group by a.FZYYSNO, a.FDSTYPE;

注意:数据过多的话,查询效率会变慢,所以可以考虑在t_noentryquery 中新增一个字段(workday字段),在插入数据的时候,根据出院日期或者其他日期来计算两个时间的工作日有多少,然后赋值给workday字段,这样子在最后统计报表查询工作日大于10的也是可以的.


1. 性能问题:如果函数的执行时间比较长,那么查询的时间会非常长,可能会导致性能问题。这可能会导致查询时间变慢,影响整个系统的性能,甚至可能导致系统崩溃。

2. 资源消耗:在执行查询时,每个函数调用都需要消耗一定的系统资源,包括 CPU、内存和磁盘 I/O 等。如果查询的数据量非常大,那么可能会消耗大量的系统资源,导致系统资源紧张甚至崩溃。

3. 维护难度:如果函数需要修改或者出现了错误,那么需要对每个查询进行修改或修复,这将是一个非常繁琐的任务。此外,如果在执行查询时出现错误,很难确定错误的位置和原因。

4. 可读性差:如果查询语句过于复杂或者包含大量的函数调用,那么查询的可读性将会变差,并且很难理解和维护。

为了解决这些问题,可以尝试优化查询语句,减少函数调用的次数,使用更高效的算法和数据结构,或者在执行查询之前对数据进行缓存,以减少函数调用的次数。此外,还应该确保函数的执行时间尽可能短,并且对函数进行测试和优化,以确保其性能和正确性。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值