我需要计算两个日期之间的天数decimal, 不包括周末和节假日 by 使用自定义函数在 Oracle SQL 中。
网站上也有类似的问题;然而,正如我所看到的,它们都没有要求使用自定义函数将输出作为十进制。我需要小数的原因是为了之后能够使用/提取时间分量。如果已经有这样的问题,请分享链接。
尝试借助我在互联网上找到的附加内容编写如下函数感谢作者 https://sqljana.wordpress.com/2017/03/16/oracle-calculating-business-days-between-two-dates-in-oracle/。内部子查询单独工作正常,但它不能作为一个整体功能工作。
简而言之,这个想法是:
(计算开始日期和结束日期之间的日差)->(排除开始日期和结束日期之间的周末天数)->(排除开始日期和结束日期之间的周末天数)
当我尝试保存该函数时,出现错误PLS-00103: Encountered the symbol "end-of-file"
。由于我已经是函数新手,可能缺少一些基本的东西。
最后,如果您对如何提高代码效率有任何建议,也请告诉我。
提前致谢!
CREATE OR REPLACE FUNCTION NET_WORKING_DAYS (startdate IN DATE, enddate IN DATE)
RETURN NUMBER IS
WORKINGDAYS_BETWEEN NUMBER;
BEGIN
SELECT
-- number of days between startdate and enddate
(
SELECT (TO_DATE('20160831150000','YYYYMMDDHH24MISS') - TO_DATE('20160801000000','YYYYMMDDHH24MISS') ) DAYS_BETWEEN
FROM DUAL
)
-
-- number of weekend days (after a given date)
(
SELECT COUNT(1) WEEKEND_DAYS_BETWEEN
FROM
(
SELECT
TO_DATE('20160701000000','YYYYMMDDHH24MISS') + SEQ as day_date, --2016/07/01 is a constant/given date for this formula
TO_CHAR(TO_DATE('20160701000000','YYYYMMDDHH24MISS') + SEQ , 'D') day_of_week
FROM
(
SELECT ROWNUM-1 SEQ
FROM ( SELECT 1 FROM DUAL CONNECT BY LEVEL<= 365 * 5) --5 years
)
ORDER BY 1
)
WHERE day_of_week IN (6,7)
AND day_date > TO_DATE('20160801000000','YYYYMMDDHH24MISS') --this should be replaced with startdate parameter
AND day_date < TO_DATE('20160831000000','YYYYMMDDHH24MISS') --this should be replaced with enddate parameter
)
-
-- number of holidays (after a given date)
(
SELECT COUNT(1)
FROM HOLIDAYS
WHERE HOLIDAY_DATE > TO_DATE('20160801000000','YYYYMMDDHH24MISS') --this should be replaced with startdate parameter
AND HOLIDAY_DATE < TO_DATE('20160831000000','YYYYMMDDHH24MISS') --this should be replaced with enddate parameter
)
INTO WORKINGDAYS_BETWEEN
FROM DUAL;
RETURN WORKINGDAYS_BETWEEN;
END NET_WORKING_DAYS;
**EDIT-1:假期已在数据库中的 HOLIDAYS 表中定义,并且此日期范围从20160801000000
to 20160831000000
, 30.06.2016
是假期日期。