您的位置:首页 > 数据库 > Oracle

Oracle数据库两个日期相减

2013-09-25 21:27 190 查看
两个时间相减默认的是天数

oracle 两个时间相减默认的是天数*24 为相差的小时数

oracle 两个时间相减默认的是天数*24*60 为相差的分钟数

oracle 两个时间相减默认的是天数*24*60*60 为相差的秒数

如下:

SQL>select sysdate from dual;

       2008-2-20 14:32:35

SQL> select (sysdate-to_date('2008-02-17 23:00:00','yyyy-mm-dd hh24:mi:ss')) from dual;

SQL> select (sysdate-to_date('2008-02-17 23:00:00','yyyy-mm-dd hh24:mi:ss'))*24 from dual;

SQL> select (sysdate-to_date('2008-02-17 23:00:00','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from dual;

1、对于2个DATE类型直接相减,就可以得到天数的值,如:

select to_date('2006-05-11 12:30:01','YYYY-MM-DD HH24:MI:SS')   -to_date('2006-05-11 12:30:00','YYYY-MM-DD HH24:MI:SS') T from dual;

结果:

          T

-------------------

.000011574

这个得到的天数很容易换算成秒,如 0.000011574*24*60*60=1s。

2、在ORACLE里日期类型是可以直接进行比较的。举个例子

SQL> SELECT to_date('2006-12-05', 'yyyy-mm-dd') - to_date('2006-12-07', 'yyyy-mm-dd') FROM dual ;

TO_DATE('2006-12-05','YYYY-MM-DD')-TO_DATE('2006-12-07','YYYY-MM-DD')

---------------------------------------------------------------------

                                                               -2

这说明2006-12-05要比7号早2天。

SQL> SELECT to_date('2006-12-07 14:23:24' , 'yyyy-mm-dd hh24:mi:ss') + 1/24 FROM dual ;

TO_DATE('2006-12-07

-------------------

2006-12-07 15:23:24

SQL>

这是说明在某一时间上加一小时,1是代表一天,1/24就是一小时,同理1/24/60就是一分钟

select trunc(sysdate) - trunc(to_date('2006-05-28 10:20','YYYY-MM-DD HH24:MI')) from dual

3、datediff在Oralce中的实现:

create or replace function 

-- -- works in roughly the same way as sybase datsdiff

-- call would be eg. datediff('month',date1,date2)

-- p_what would be 'HOUR', 'DAY','MONTH' OR 'QUARTER'

datediff( p_what in varchar2,

      p_d1 in date,

      p_d2 in date ) return number

as

l_result number;

begin

l_result:=;

if (upper(p_what) = 'HOUR') then

   l_result:=((p_d2-p_d1)*24);

end if;

if (upper(p_what) = 'DAY') then

   l_result:=(p_d2-p_d1);

end if;

if (upper(p_what) = 'MONTH') then

   l_result:=round(MONTHS_BETWEEN(p_d2,p_d1),0);

end if;

if (upper(p_what) = 'QUARTER') then

   l_result:=((floor(MONTHS_BETWEEN(p_d2,TRUNC(p_d2,'YEAR'))/3)+1) - (floor(MONTHS_BETWEEN(p_d1,TRUNC(p_d1,'YEAR'))/3)+1) + (((to_char(p_d2, 'yyyy')) - (to_char(p_d1, 'yyyy')))*4));

end if;

   l_result:=floor(l_result);

   return l_result;

end;

/

SQL> SELECT DATEDIFF('MONTH','11-JUL-1975','07-JUN-2004') FROM DUAL;

DATEDIFF('MONTH','11-JUL-1975','07-JUN-2004')

---------------------------------------------

                                       347
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: