计算任意两个日期之间的工作天数_plsql函数

2022-10-19 16:33:30   第一文档网     [ 字体: ] [ 阅读: ] [ 文档下载 ]
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。下载word有问题请添加QQ:admin处理,感谢您的支持与谅解。点击这里给我发消息

#第一文档网# 导语】以下是®第一文档网的小编为您整理的《计算任意两个日期之间的工作天数_plsql函数》,欢迎阅读!
天数,函数,任意,之间,两个

由于项目需要,前几天用java写了一个函数,实现的功能是计算两个日期之间的工作日天数-除去(周末和公共假日)洋洋洒洒写了 300多行的代码, 实现公共假日从文件中读取, 或者从数据库提取, 然后传入两个日期,就能返回想要的结果, 今天发现报表用的是jasper report 不知道如何调用或者不能调用java函数, 无奈之下想到了PLSQL, 同事几分钟后给我一段简短的代码. 着实让我吃了一惊..

下面是代码:

CREATE OR REPLACE FUNCTION calcDates(START_DATE IN DATE, END_DATE IN DATE)

RETURN number IS

No_of_DAYS number;

BEGIN

IF START_DATE < END_DATE THEN

SELECT count(1) days

INTO NO_OF_DAYS

FROM (SELECT DISTINCT trunc(START_DATE) + level - 1 dayList

FROM dual

connect BY trunc(START_DATE) + level - 1 < = trunc(END_DATE)) A

where not exists (select 1

from dp_tbl_public_holiday b

where to_date(b.ph_date, 'YYYYMMDD') = A.dayList)

and to_char(dayList, 'D') not in (1, 7);

ELSE

SELECT 0 - count(1) days

INTO NO_OF_DAYS

FROM (SELECT DISTINCT trunc(END_DATE) + level - 1 dayList

FROM dual

connect BY trunc(END_DATE) + level - 1 < = trunc(START_DATE)) A

where not exists (select 1

from dp_tbl_public_holiday b

where to_date(b.ph_date, 'YYYYMMDD') = A.dayList)

and to_char(dayList, 'D') not in (1, 7);

END IF;

Return No_of_DAYS;

END;

注释:

1.dp_tbl_public_holiday

存储着 假期的信息, ph_date 假期的日期.

2.to_char(dayList, 'D') not in (1, 7);

这个强大的 to_char(dayList, 'D')返回的是日期是星期几,就好比是java里面的 Calendar.DAY_OF_WEEK,

not in (1, 7)就是不在周六或者周日, 1是周日, 7是周六 ,这个和java一样.

3.trunc(START_DATE) trunc 函数拿到的是日期的值,忽略小时数.

4.SELECT DISTINCT trunc(START_DATE) + level - 1 dayList

FROM dual

connect BY trunc(START_DATE) + level - 1 < = trunc(END_DATE)

这段代码就是列出两个日期之间所有日期. connect by 和 level 是个深奥的东东.需要好好消化`

本文来源:https://www.dywdw.cn/114ea1631ed9ad51f01df27b.html

相关推荐
推荐阅读