在工作中可能会有这种需求,想要根据开始时间和延迟特定工作日天数获得延迟后的具体日期(不包含周末和节假日
),例如:依据日期2012-08-27获取延迟5个工作日后的日期,得到具体日期2012-09-03;
那这种情况应该如何处理呢?
本文将从数据库角度来解决这一问题,当然利用代码在逻辑中更容易实现哦!!
注:本文应用是oracle10;
第一步:
创建一个表格holiday用于灵活存放节假日日期(周末除外),如果和周末日期重复,则无需添加到该表格中:
create table HOLIDAY (
ID VARCHAR2(45) not null,
HL_DATE DATE,
HL_DESC VARCHAR2(500),
REMARK VARCHAR2(500),
constraint PK_HOLIDAY primary key (ID)
);
comment on table HOLIDAY is
'节假日日期表(不含周末)';
comment on column HOLIDAY.ID is
'节假日编号';
comment on column HOLIDAY.HL_DATE is
'节假日期';
comment on column HOLIDAY.HL_DESC is
'假日说明';
comment on column HOLIDAY.REMARK is
'备注';
添加一些测试数据:
ID HL_DATE HL_DESC
1 2012-9-29 十一
2 2012-10-1 十一
3 2012-10-2 十一
4 2012-10-3 十一
5 2012-10-4 十一
6 2012-10-5 十一
7 2012-9-3 测试
8 2012-9-5 测试
9 2012-9-6 测试
第二步:写个函数用以获取两个日期之间的周末天数,如下:
create or replace function weekend_count(startdate date,enddate date)
return number
/**返回两个时间段内的周末天数,开始日期不计算在内*/
is
weekend_num number:=0;
tempdate date;
begin
tempdate:=startdate+1;
while tempdate<=enddate loop
weekend_num:=weekend_num+(case when to_char(tempdate,'day') in('星期六','星期日') then 1 else 0 end);
tempdate:=tempdate+1;
end loop;
return weekend_num;
end;
第三步:编写函数用以获取指定日期延迟特定工作日以后的具体日期,如下:
create or replace function getDeferDate(startdate date,deferDay number)
return date
/**返回延期后的日期*/
is
enddate date :=startdate+deferDay;--延期后的日期
holiday_num number:=0;--节假日天数
weekend_num number:=0;--周末天数
nonework_num number :=0;--非工作日天数
begin
--获取周末天数
weekend_num:=weekend_count(startdate,enddate);
--获取节假日天数
select nvl(count(1),0) into holiday_num from holiday a where a.hl_date is not null and a.hl_date between startdate and enddate;
nonework_num:=weekend_num+holiday_num;
if nonework_num !=0 then
enddate :=getDeferDate(enddate,nonework_num);
end if;
return enddate;
end;
第四步:实际应用,如下:
select getdeferdate(sysdate,5) deferdate from dual;
结果如下:
DEFERDATE
1 2012-9-4 16:12:53
分享到:
相关推荐
在Oracle数据库中,获取下一个法定工作日期是一个常见的需求,尤其在进行日程安排或业务处理时。本篇文章将深入探讨如何使用Oracle内置函数以及自定义函数来实现这一功能。我们将结合具体的代码示例来理解这一过程。...
使用Oracle的SQL函数实现工作日和节假日分组统计 本文介绍了使用Oracle的SQL函数来实现工作日和节假日的分组统计,通过对工作日和节假日的判断和统计,可以更好地合理调度人力物力资源,制定节假日劳务补贴政策。...
`LAST_DAY()`用于获取指定日期所在月份的最后一天,而`NEXT_DAY()`用于获取指定日期之后的下一个工作日或特定星期几的日期。 - **`TO_CHAR()`函数的格式模型**:`TO_CHAR()`函数可以接受第二个参数指定日期或数字的...
Oracle数据库本身并不内置农历日期转换的功能,但通过创建自定义函数和使用特定的算法,可以实现从农历到阳历的转换。以下是一个基于给定文件中的方法来解决这个问题的详细步骤: 1. 创建年份编码表 首先,我们需要...
在Oracle数据库中,处理汉字和拼音的场景时,有时我们需要获取汉字的拼音或者拼音首字母。这在构建中文搜索引擎、数据分析或报表展示等场景中非常有用。Oracle提供了一些内置的功能函数,可以用来实现这些需求。以下...
oracle 获取用户ddl脚本,可获取用户ddl,在sqlplus 工具中打开
### Oracle 获取汉字拼音首字母 在Oracle数据库中实现获取汉字拼音首字母的需求,通常涉及到对中文字符的处理以及拼音转换的技术。这样的功能可以应用于多种场景,例如数据排序、索引建立或是快速检索等。本文将...
标题“Oracle 获取某日期属于一年中的第几个自然周”指的是在Oracle数据库系统中,通过SQL查询来确定一个特定日期在当年是第几周的问题。在实际业务中,这样的功能可能用于统计、报告或者数据分析,例如,公司可能...
本人编写,通过自己定义的函数计算两个日期之间周末的天数和工作日天数,经过测试,非常好用
虽然Oracle本身不直接提供这样的功能,但借助PL/SQL和第三方算法,我们可以轻松地扩展其日期处理能力,满足特定的需求。在实际操作时,务必注意字符集问题,确保在不同的字符集环境下都能正确工作。
`NEXT_DAY`函数用于获取指定日期之后的下一个特定工作日。例如,获取下一个星期一: ```sql SELECT NEXT_DAY(SYSDATE, 'MONDAY') FROM DUAL; ``` 以上就是关于Oracle处理日期的相关知识点详解,希望能帮助读者更好...
oracle 自定义方法 判断日期是不是为假期 如果是假期则取下一天 直到工作日爲止
本次练习涵盖了 Oracle 中常用的日期函数,包括获取当前系统时间、对日期的月进行加减、获取给定日期所在月的最后一天的日期、计算给定两个日期相隔的月数、计算给定日期后的第一个工作日、取出给定日期的年、月、日...
在Oracle SQL中,根据年份和周数获取特定日期是一个常见的需求,特别是在处理时间序列数据或进行周期性分析时。本文将深入探讨如何利用Oracle SQL的功能来实现这一目标,包括理解Oracle中的日期函数、如何计算特定...
例如,要获取当前日期的年月日格式,可以使用以下SQL语句: ```sql SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL; ``` 如果只需要月份,则可以使用: ```sql SELECT TO_CHAR(SYSDATE, 'MM') FROM DUAL; ``` ...
oracle,按特定字符,截取字符串,直接出结果 oracle,按特定字符,截取字符串,直接出结果oracle,按特定字符,截取字符串,直接出结果
在Oracle数据库中,日期操作是常见的SQL查询任务,特别是在处理历史数据或进行时间相关的分析时。Oracle提供了丰富的函数来帮助用户对日期进行加减操作,这些功能强大且灵活的函数使得开发者能更精确地处理时间数据...
压缩包内有2个文件 1、Excel表列举了2024年所有日期,并标记了日期类型(0:工作日 1:周末 2...2、文本文件内含有关sql,基于Oracle,建表sql,日期数据新增sql,并也标记了日期类型(0:工作日 1:周末 2:节假日)。
### Oracle 验证是否是日期 在Oracle数据库中,经常需要对输入的数据进行格式校验,尤其是日期格式的校验尤为重要。本文将详细介绍一个自定义的Oracle函数`FN_ISDATE_JAVA`,该函数用于判断给定的字符串是否能够...
通过简单的设置,可查询工作日相关信息。如:今天是本月第几个工作日,今天是本年度第几个工作日,今天之后第N个工作日是哪天,之前的第N个工作日是哪天等。对计算同比,环比,限时办结等需求帮助很大。