oracle 日期计算函数

来源:互联网 发布:淘宝什么叫发票抬头 编辑:程序博客网 时间:2024/04/29 13:02

转:http://www.itpub.net/thread-468149-1-1.html

最近看到有人在做t_sql与pl/sql的转化, 问了些有关时间函数的处理, 在此, 仅对t_sql中的dateadd函数做说明, 这个函数在pl/sql中没有对应的函数, 但是oracle提供了其他的方法来处理, 这里, 本人写了一个同名的函数 dateadd用于方便移植使用, 其中用到的处理时间的方法在oracle中也很通用.

函数代码如下
create or replace function DATEADD( datepart varchar2, num number, indate date ) return date is
Result date;
v_sql varchar2(1000);
v_datepart varchar2(30);
v_ms varchar2(13);
begin
v_datepart := lower(datepart);
/*
Datepart Abbreviations
year yy, y
quarter qq, q
month mm, m
day dd, d
week wk, w
hour hh, h
minute mi, n
second ss, s
millisecond ms
*/
case
when v_datepart in ('year','yy','y') then
v_sql := 'select :1 + interval '''||num||''' year from dual';
when v_datepart in ('quarter','qq','q') then
v_sql := 'select :1 + (interval ''3'' month) * '||num||' from dual';
when v_datepart in ('month','mm','m') then
v_sql := 'select :1 + interval '''||num||''' month from dual';
when v_datepart in ('week','wk','w') then
v_sql := 'select :1 + (interval ''7'' day) * '||num||' from dual';
when v_datepart in ('day','dd','d') then
v_sql := 'select :1 + interval '''||num||''' day from dual';
when v_datepart in ('hour','hh') then
v_sql := 'select :1 + interval '''||num||''' hour from dual';
when v_datepart in ('minute','mi','n') then
v_sql := 'select :1 + interval '''||num||''' minute from dual';
when v_datepart in ('second','ss','s') then
v_sql := 'select :1 + interval '''||num||''' second from dual';
when v_datepart in ('millisecond','ms') then
v_ms := to_char(num/1000,'fm999999990.000');
v_sql := 'select :1 + interval '''||v_ms||''' second(9,3) from dual';
else
RAISE_APPLICATION_ERROR(-20001, ''''||datepart||''' is not a recognized dateadd option.' );
end case;

execute immediate v_sql into Result using indate;

return(Result);

EXCEPTION
WHEN OTHERS THEN
RAISE ;

end DATEADD;

函数中有一段注释, 是用来说明datepart的, 基本上和t_sql中的相同, 稍有修改

使用示例如下:
加三周时间:
SQL> select dateadd('w',3,sysdate), sysdate from dual;

DATEADD('W',3,SYSDATE) SYSDATE
---------------------- -----------
2006-1-9 17:16:29 2005-12-19

减一个季度时间:
SQL> select dateadd('q',-1,sysdate), sysdate from dual;

DATEADD('Q',-1,SYSDATE) SYSDATE
----------------------- -----------
2005-9-19 17:22:00 2005-12-19

大家随意点评吧

原创粉丝点击