oracle计算两个日期的时间差时分秒

Oracle函数可以实现诸多的功能,下面就介绍使用Oracle函数计算时间差的实现方法。

两个Date类型字段:START_DATEEND_DATE,计算这两个日期的时间差(分别以天,小时,分钟,秒,毫秒):

天: ROUND(TO_NUMBER(END_DATE - START_DATE))

小时: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24)

分钟: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60)

秒: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60)

毫秒: ROUND(TO_NUMBER(END_DATE - START_DATE) * 24 * 60 * 60 * 1000)

例子:

select ROUND(TO_NUMBER(
to_date(to_char(sysdate,'yyyy-MM-dd hh24:mi:ss'),'yyyy-MM-dd hh24:mi:ss') - to_date('2012-05-11 10:37:40','yyyy-MM-dd hh24:mi:ss'))*24*60*60) 
from dual
select ROUND(TO_NUMBER(to_date(to_char(sysdate,'yyyy-MM-dd hh24:mi:ss'),'yyyy-MM-dd hh24:mi:ss')
- to_date('2013-01-16 00:00:00','yyyy-MM-dd hh24:mi:ss'))*24*60*60) from dual

to_date如何取得毫秒?

由于oracledate类型只支持到秒,不支持到毫秒,所以to_date()不能取到毫秒。 如果要取到毫秒,oracle 9i以上版本,可以使用timestamp类型,是date的扩展类型,能支持到毫秒,毫秒的显示精度是6位,不过有效位是3位,即最大值达到999,满1000ms就进为1s。而与to_date()对应的转换函数可以使用to_timestamp()select to_timestamp('2011-12-15 10:40:10.345', 'yyyy-MM-dd HH24:MI:ss.ff') as mydate from dual; 如果想将timestamp又转换成date类型,可以使用cast()函数,但得到的date类型没有了毫秒值。如下: select cast(to_timestamp('2011-12-15 10:40:10.345', 'yyyy-MM-dd HH24:MI:ss.ff') as date) as mydate from dual;


Oracle时间类型date,timestamp时间差计算

Oracle的时间类型有两种datetimestamp. date精确到秒,timestamp精确到毫秒.

1.计算date类型的时间差

可以先把年,月,日,小时,分,秒用to_char函数拆分出来,再用to_number函数转换成数值类型.有了这些单独分开的时间就好办了.就再一个个的去减,记得考虑单位换算就行.比如都转换成小时或分之类的

示例:

declare

v_date date;

v_year int;

v_month int;

v_day int;

v_hour int;

v_minute int;

v_second int;

begin

 v_date := sysdate;

 v_year :=to_number( to_char(v_date,'yyyy'));

--月,日,小时,分,秒的拆分方法和上面年的一样,只要把yyyy分别替换成mm,dd,hh,mi,ss就行了

end;

--timestamp类型的时间也可以用同样的方法,但是这只能精确到秒,后面的毫秒就忽略掉了

2.计算timestamp类型的时间差

to_char函数不能拆分出毫秒来.可以用另外一个函数extract

示例

declare

v_t timestamp;

v_year int;

v_s float;

begin

 v_t := systimestamp;

 v_year := extract(year from v_t);

--月,日,小时,分的拆分方法和上面的年一样只要把year改成month,day,hour,minute就行.

v_s :=extract(second from v_t);--注意,这里虽然也只能拆分到秒,但这里的秒是带小数点的,小数点后面的就是毫秒了.

end;

Oracle中两个TIMESTAMP时间类型的差

首先需要先转换成char类型

to_char(t.restime, 'yyyy-mm-dd hh24:mi:ss')

然后在转换为date

TO_DATE((to_char(t.restime, 'yyyy-mm-dd hh24:mi:ss')),'yyyy-mm-dd hh24:mi:ss')

再将两个date类型相减

to_number(
(
TO_DATE((to_char(t.restime, 'yyyy-mm-dd hh24:mi:ss')),'yyyy-mm-dd hh24:mi:ss') - 
TO_DATE(to_char(t.servertime, 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss')
)
)* 86400 
as miao

猜你喜欢

转载自blog.csdn.net/wulex/article/details/80808579