Oracle國家節假日以及交易日篩選的儲存過程

2021-08-10 00:15:04 字數 3842 閱讀 3551

需求:篩選出今天之前的三個交易日,排除週六週日以及國家法定節假日

一、建立節假日表

create table holiday

(holiday_date number(10) not null,

holiday_name varchar2(255) not null,

holiday_type char(1) not null,

time_stamp   date default sysdate

)tablespace ts_dw

pctfree 10

initrans 1

maxtrans 255

storage

(initial 80k

next 16k

minextents 1

maxextents unlimited

);comment on column holiday.holiday_date

is '節假日期(yyyymmdd)';

comment on column holiday.holiday_name

is '節假日名稱';

comment on column holiday.holiday_type

is '是否放假';

comment on column holiday.time_stamp

is '時間戳';

注意:節假日資訊需要手動維護,每年根據國家公布的節假日資訊進行更新即可。

insert into holiday (holiday_date, holiday_name, holiday_type)  values  (20170214, '情人節', '1');

insert into holiday (holiday_date, holiday_name, holiday_type)  values  (20171001, '國慶節、中秋節', '0');

二、儲存過程

create or replace procedure holiday_test is

i                number default 0;

todaydate        date;--今天

num              number;

h_type           char;

flag             number;--1是節假日   0為不是節假日

week              number default 0;

one              date;--昨天

two              date;--前天

onenum           number;

twonum           number;

todaynum         number;

begin

--初始化為系統當前日期

todaydate        := sysdate;

--判斷今天是不是週末

select to_char(todaydate, 'd') into week from dual;

todaynum := to_char(todaydate, 'yyyymmdd');

--判斷今天是不是節假日

select count(*) into num from holiday   where holiday_date = todaynum;

if num > 0 then

--說明有記錄

select holiday_type into h_type from holiday where holiday_date = todaynum;

if h_type != '0' then

--holiday_type 不等於 0 說明不是節假日

flag := 0;

else

flag := 1;

end if;

else

flag := 0;

end if;

-- begin 處理

--今天不是週六且不是週末且不是節假日  如果今天是交易日則處理,否則不做任何處理

if (week <> 1) and (week <> 7) and (flag = 0) then

--昨天

one := todaydate - 1;--今天的前一天

i   := 0;--初始化迴圈引數

while i < 20 loop

select to_char(one, 'd') into week from dual;--判斷是否是週末

onenum := to_char(one, 'yyyymmdd');

--判斷是否是節假日

select count(*) into  num  from holiday   where holiday_date = onenum;

if num > 0 then--說明有記錄

select holiday_type into h_type from holiday where holiday_date = onenum;

if h_type != '0' then

--holiday_type 不等於 0 說明不是節假日

flag := 0;

else

flag := 1;

end if;

else

flag := 0;

end if;

--開始處理

if (week not in (1, 7)) and (flag = 0 ) then

--跳出當前迴圈

exit;

end if;

one := one - 1;

i   := i + 1;

end loop;

--前天

i   := 0; --初始化迴圈引數

two := one - 1;

while i < 20 loop

select to_char(two, 'd') into week from dual;--判斷是否是週末

twonum := to_char(two, 'yyyymmdd');

--判斷是否是節假日

select count(*) into  num  from holiday   where holiday_date = twonum;

if num > 0 then--說明有記錄

select holiday_type into h_type from holiday where holiday_date = twonum;

if h_type != '0' then

--holiday_type 不等於 0 說明不是節假日

flag := 0;

else

flag := 1;

end if;

else

flag := 0;

end if;

--開始處理

if (week not in (1, 7)) and (flag = 0 ) then

--跳出當前迴圈

exit;

end if;

two := two - 1;

i   := i + 1;

end loop;

dbms_output.put_line('today is '||todaynum);

dbms_output.put_line('one is '||onenum);

dbms_output.put_line('two is '||twonum);

end if;

end holiday_test;

執行此儲存過程,即可篩選出今天之前的三個交易日。

「法」定節假日

今天,法 定節假日的新方案出來了,要把五一的三天變成一天。這下可好,本來五一可以休七天的,估計現在只能和元旦一樣休兩天了。因為我們並沒有雙休,只是領導開恩才好不容易過上了 周 的。其實,對於 法 定節假日並不是太在意,也沒有權利在意,帶薪休假 就更不敢奢求了。最實在的是zf能不能強制企業實行最基本的...

「法」定節假日

今天,法 定節假日的新方案出來了,要把五一的三天變成一天。這下可好,本來五一可以休七天的,估計現在只能和元旦一樣休兩天了。因為我們並沒有雙休,只是領導開恩才好不容易過上了 周 的。其實,對於 法 定節假日並不是太在意,也沒有權利在意,帶薪休假 就更不敢奢求了。最實在的是zf能不能強制企業實行最基本的...

假日情節 假日回家的意義

來提高班近三年了,這是在學校度過的第三個暑假。每逢假日,我們總會談起節假日在校學習的意義的話題。現在回家能給家裡帶來什麼?現在每次回家在家呆不了幾天,爸媽會把我當寶一樣寵著,不讓幹這不讓幹那,還會做好吃的等著我 每次回家他們都會問,要多少錢啊,離家前他們會提前給我準備好我需要的生活費。我做著令自己最...