`
edwardcoo
  • 浏览: 15843 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

oracle获取延期特定工作日以后的日期

阅读更多

在工作中可能会有这种需求,想要根据开始时间和延迟特定工作日天数获得延迟后的具体日期(不包含周末和节假日

),例如:依据日期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内置函数以及自定义函数来实现这一功能。我们将结合具体的代码示例来理解这一过程。...

    使用Oracle的SQL函数实现工作日和节假日分组统计.pdf

    使用Oracle的SQL函数实现工作日和节假日分组统计 本文介绍了使用Oracle的SQL函数来实现工作日和节假日的分组统计,通过对工作日和节假日的判断和统计,可以更好地合理调度人力物力资源,制定节假日劳务补贴政策。...

    oracle获取汉字拼音和拼音首字母的功能函数

    在Oracle数据库中,处理汉字和拼音的场景时,有时我们需要获取汉字的拼音或者拼音首字母。这在构建中文搜索引擎、数据分析或报表展示等场景中非常有用。Oracle提供了一些内置的功能函数,可以用来实现这些需求。以下...

    Oracle sql查询当前月的所有日期

    `LAST_DAY()`用于获取指定日期所在月份的最后一天,而`NEXT_DAY()`用于获取指定日期之后的下一个工作日或特定星期几的日期。 - **`TO_CHAR()`函数的格式模型**:`TO_CHAR()`函数可以接受第二个参数指定日期或数字的...

    计算两个日期之间周末的天数和工作日天数

    本人编写,通过自己定义的函数计算两个日期之间周末的天数和工作日天数,经过测试,非常好用

    oracle处理日期大全

    `NEXT_DAY`函数用于获取指定日期之后的下一个特定工作日。例如,获取下一个星期一: ```sql SELECT NEXT_DAY(SYSDATE, 'MONDAY') FROM DUAL; ``` 以上就是关于Oracle处理日期的相关知识点详解,希望能帮助读者更好...

    oracle 自定义方法 判断日期是不是为假期 如果是假期则取下一天 直到工作日爲止

    oracle 自定义方法 判断日期是不是为假期 如果是假期则取下一天 直到工作日爲止

    oracle按特定字符截取字符串

    oracle,按特定字符,截取字符串,直接出结果 oracle,按特定字符,截取字符串,直接出结果oracle,按特定字符,截取字符串,直接出结果

    Oracle日期函数练习

    本次练习涵盖了 Oracle 中常用的日期函数,包括获取当前系统时间、对日期的月进行加减、获取给定日期所在月的最后一天的日期、计算给定两个日期相隔的月数、计算给定日期后的第一个工作日、取出给定日期的年、月、日...

    oracle日历转化成农历

    虽然Oracle本身不直接提供这样的功能,但借助PL/SQL和第三方算法,我们可以轻松地扩展其日期处理能力,满足特定的需求。在实际操作时,务必注意字符集问题,确保在不同的字符集环境下都能正确工作。

    oracle sql 根据年份、周数取日期

    在Oracle SQL中,根据年份和周数获取特定日期是一个常见的需求,特别是在处理时间序列数据或进行周期性分析时。本文将深入探讨如何利用Oracle SQL的功能来实现这一目标,包括理解Oracle中的日期函数、如何计算特定...

    oracle日期查询相关

    例如,要获取当前日期的年月日格式,可以使用以下SQL语句: ```sql SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') FROM DUAL; ``` 如果只需要月份,则可以使用: ```sql SELECT TO_CHAR(SYSDATE, 'MM') FROM DUAL; ``` ...

    2024年日历excel和Oracle新增sql(标记上班日,周末,节假日)

    压缩包内有2个文件 1、Excel表列举了2024年所有日期,并标记了日期类型(0:工作日 1:周末 2...2、文本文件内含有关sql,基于Oracle,建表sql,日期数据新增sql,并也标记了日期类型(0:工作日 1:周末 2:节假日)。

    oracle_日期_加减方法

    在Oracle数据库中,日期操作是常见的SQL查询任务,特别是在处理历史数据或进行时间相关的分析时。Oracle提供了丰富的函数来帮助用户对日期进行加减操作,这些功能强大且灵活的函数使得开发者能更精确地处理时间数据...

    oracle 获取用户ddl脚本

    oracle 获取用户ddl脚本,可获取用户ddl,在sqlplus 工具中打开

    Oracle 验证是否是日期

    ### Oracle 验证是否是日期 在Oracle数据库中,经常需要对输入的数据进行格式校验,尤其是日期格式的校验尤为重要。本文将详细介绍一个自定义的Oracle函数`FN_ISDATE_JAVA`,该函数用于判断给定的字符串是否能够...

    oracle获取汉字拼音首字母

    ### Oracle 获取汉字拼音首字母 在Oracle数据库中实现获取汉字拼音首字母的需求,通常涉及到对中文字符的处理以及拼音转换的技术。这样的功能可以应用于多种场景,例如数据排序、索引建立或是快速检索等。本文将...

    oracle工作日设置.sql

    通过简单的设置,可查询工作日相关信息。如:今天是本月第几个工作日,今天是本年度第几个工作日,今天之后第N个工作日是哪天,之前的第N个工作日是哪天等。对计算同比,环比,限时办结等需求帮助很大。

    Oracle获取系统时间及格式化

    Oracle 中获取系统时间可以使用 SYSDATE() 函数,该函数可以返回当前日期和时间。SYSDATE() 函数可以与 TO_CHAR() 函数结合使用,以将日期和时间格式化为字符串。 TO_CHAR() 函数可以将日期、数字或字符串转换为...

    Oracle获取用户下所有表名 获取表所有的列名及数据类型.txt

    Oracle获取用户下所有表名 获取表所有的列名及数据类型 两个SQL查询语句

Global site tag (gtag.js) - Google Analytics