热衷技术,热爱交流
分类: Oracle
2013-06-16 19:06:33
网友提出一个问题:
计算2013年6月9日3点13分55秒到2013年6月15日22点02分34秒有几天几小时几分几秒
于是乎,我的算法如下:
HR >select (to_date('2013-06-15 22:02:34','yyyy-mm-dd hh24:mi:ss')-to_date('2013-06-09 03:13:55','yyyy-mm-dd hh24:mi:ss'))*86400 value from dual;;
VALUE
----------
586119
HR >select trunc(586119/86400)||'天'||trunc(MOD(586119,86400)/3600)||'小时'||TRUNC(MOD(MOD(586119,86400),3600)/60)||'分'||MOD(MOD(MOD(586119,86400),3600),60)||'秒'from dual;;
TRUNC(586119/8640
-----------------
6天18小时48分39秒
一看就有点笨,qq群一聊,有个网友给了个办法:
select extract(day from diff)||'天'||extract(hour from diff)||'小时'||extract(minute from diff)||'分'||extract(second from diff)||'秒' diff_time_time
from (select to_timestamp('2013-06-15 22:02:34', 'yyyy-mm-dd hh24:mi:ss') - to_timestamp('2013-06-09 03:13:55', 'yyyy-mm-dd hh24:mi:ss') diff from dual);;
DIFF_TIME
----------------------------------------------------------------------
6天18小时48分39秒
这个算法优越性主要有两点:
1. 使用to_timestamp函数,日期时间相减可以直接得到两个日期相差多少天多少小时多少分多少秒
HR >select to_timestamp('2013-06-15 22:02:34', 'yyyy-mm-dd hh24:mi:ss') - to_timestamp('2013-06-09 03:13:55', 'yyyy-mm-dd hh24:mi:ss') diff from dual;
DIFF
---------------------------------------------------------------------------
+000000006 18:48:39.000000000
2.于是乎,可以用exact函数进行截取了。
这个函数使用方法如下:
EXTRACT (
{ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }
| { TIMEZONE_HOUR | TIMEZONE_MINUTE }
| { TIMEZONE_REGION | TIMEZONE_ABBR }
FROM { date_value | interval_value } )