【发布时间】:2009-10-01 20:28:52
【问题描述】:
如何编写一个表达式,以天、小时、分钟、秒等形式给出两个日期之间的差异?默认情况下,oracle 中减去两个日期会以小数形式返回天数。
【问题讨论】:
如何编写一个表达式,以天、小时、分钟、秒等形式给出两个日期之间的差异?默认情况下,oracle 中减去两个日期会以小数形式返回天数。
【问题讨论】:
用途:
SELECT TO_CHAR(date1,'MMDDYYYY:HH24:MI:SS') date1,
TO_CHAR(date2,'MMDDYYYY:HH24:MI:SS') date2,
TRUNC(86400*(date2-date1)) - 60*(TRUNC((86400*(date2-date1))/60)) seconds,
TRUNC((86400*(date2-date1))/60) - 60*(TRUNC(((86400*(date2-date1))/60)/60)) minutes,
TRUNC(((86400*(date2-date1))/60)/60) - 24*(TRUNC((((86400*(date2-date1))/60)/60)/24)) hours,
TRUNC((((86400*(date2-date1))/60)/60)/24) days,
TRUNC(((((86400*(date2-date1))/60)/60)/24)/7) weeks
FROM TABLE
【讨论】:
该小数是所提供的两个日期之间的天数差。您可以做一些数学运算,将其转换为天、小时、分钟、秒等。
编辑:我知道你在找什么。我确信有一个更简单的方法,但我可能会这样做:
select trunc(5.3574585) days,
trunc(mod((5.3574585) * 24, 24)) hours,
trunc(mod((5.3574585) * 24 * 60, 60)) minutes,
trunc(mod((5.3574585) * 24 * 60 * 60, 60)) seconds
from dual;
...其中 5.3574585 是减法返回的天数...
注意:这并没有真正经过测试,我想不到。
【讨论】:
为什么不直接转换为时间戳并隐式使用间隔天到秒的数据类型?
select to_timestamp(sysdate+1.1234) - to_timestamp(sysdate) diff
from dual
/
DIFF
-----------
1 2:57:42.0
【讨论】:
NUMTODSINTERVAL函数:SELECT NUMTODSINTERVAL(1.1234, 'DAY') FROM DUAL;
您可以将日期转换为时间戳并使用本机功能来获取各个组件...
SELECT EXTRACT( DAY FROM ( end_timestamp - start_timestamp ) ) days
, EXTRACT( HOUR FROM ( end_timestamp - start_timestamp ) ) hours
, EXTRACT( MINUTE FROM ( end_timestamp - start_timestamp ) ) minutes
, EXTRACT( SECOND FROM ( end_timestamp - start_timestamp ) ) seconds
FROM ( SELECT TO_TIMESTAMP( TO_CHAR( start_date, 'DD/MM/YYYY HH24:MI:SS' )
, 'DD/MM/YYYY HH24:MI:SS' ) start_timestamp
, TO_TIMESTAMP( TO_CHAR( end_date, 'DD/MM/YYYY HH24:MI:SS' )
, 'DD/MM/YYYY HH24:MI:SS' ) end_timestamp
FROM ( SELECT TO_DATE( '01/10/2009 14:25:01'
, 'DD/MM/YYYY HH24:MI:SS' ) start_date
, TO_DATE( '03/10/2009 23:09:15'
, 'DD/MM/YYYY HH24:MI:SS' ) end_date
FROM dual
)
)
【讨论】: