Oracle:计算两个日期之间的时间差,单位为HH:MM:SS
我有两个日期,格式如下: ST_DT=太阳2013年12月29日11:55:29东部时间 ED_DT=2013年12月30日星期二20:21:34东部标准时间Oracle:计算两个日期之间的时间差,单位为HH:MM:SS,oracle,date,Oracle,Date,我有两个日期,格式如下: ST_DT=太阳2013年12月29日11:55:29东部时间 ED_DT=2013年12月30日星期二20:21:34东部标准时间 我想以HH:MM:SS格式找出这两个日期之间的差异。现在我的问题是,我不知道如何在Oracle中解析上述日期格式。我想出了一个解决方案,但它只适用于相同的时区日期 with tab as ( select to_date(replace(substr('Sun Dec 28 23:59:59 EST 2013', 4), 'EST '),
我想以HH:MM:SS格式找出这两个日期之间的差异。现在我的问题是,我不知道如何在Oracle中解析上述日期格式。我想出了一个解决方案,但它只适用于相同的时区日期
with tab as (
select to_date(replace(substr('Sun Dec 28 23:59:59 EST 2013', 4), 'EST '), 'Mon DD HH24:MI:SS RRRR') start_date,
to_date(replace(substr('Tue Dec 30 20:21:34 EST 2013', 4), 'EST '), 'Mon DD HH24:MI:SS RRRR') end_date
from dual),
tab_sec as
(select ((end_date - start_date) * 24 * 60 * 60) sec from tab)
select lpad(trunc(sec / (60*60)), 2, '0')||':'||
lpad(trunc((sec - (trunc(sec / (60*60)) * 60 * 60))/60), 2, '0')||':'||
lpad(mod(sec, 60), 2, '0') diff
from tab_sec;
您可以使用
NUMTODSINTERVAL
比如说
with x as (
select to_date('01/01/2014 10:00:00','dd/mm/yyyy hh24:mi:ss') d1 ,
to_date('01/01/2014 12:00:00','dd/mm/yyyy hh24:mi:ss') d2
from dual
union all
select to_date('02/01/2014 10:00:00','dd/mm/yyyy hh24:mi:ss') d1 ,
to_date('01/01/2014 12:00:00','dd/mm/yyyy hh24:mi:ss') d2
from dual
union all
select to_date('01/01/2014 10:30:00','dd/mm/yyyy hh24:mi:ss') d1 ,
to_date('01/01/2014 12:00:00','dd/mm/yyyy hh24:mi:ss') d2
from dual
union all
select to_date('01/01/2014 10:00:30','dd/mm/yyyy hh24:mi:ss') d1 ,
to_date('01/01/2014 12:00:00','dd/mm/yyyy hh24:mi:ss') d2
from dual
union all
select to_date('01/01/2014 10:00:30','dd/mm/yyyy hh24:mi:ss') d1 ,
to_date('02/01/2014 12:20:10','dd/mm/yyyy hh24:mi:ss') d2
from dual
)
select d1 , d2 , numtodsinterval(d2 - d1, 'day') as interval_diff
from x
D1 D2 INTERVAL_DIFF
------------------- ------------------- ---------------------------------
01/01/2014 10:00:00 01/01/2014 12:00:00 +000000000 02:00:00.000000000
02/01/2014 10:00:00 01/01/2014 12:00:00 -000000000 22:00:00.000000000
01/01/2014 10:30:00 01/01/2014 12:00:00 +000000000 01:30:00.000000000
01/01/2014 10:00:30 01/01/2014 12:00:00 +000000000 01:59:30.000000000
01/01/2014 10:00:30 02/01/2014 12:20:10 +000000001 02:19:39.999999999
varchar2中的日期是类型吗?然后,您可以首先将其转换为时间戳格式。由于它也有时区,请使用该功能
SQL> select to_timestamp_tz('Sun Dec 29 11:55:29 EST 2013','Dy Mon dd hh24:mi:ss TZR yyyy') from dual;
TO_TIMESTAMP_TZ('SUNDEC2911:55:29EST2013','DYMONDDHH24:MI:SSTZRYYYY')
---------------------------------------------------------------------------
29-DEC-13 11.55.29.000000000 AM EST
一旦日期是时间戳类型,减去它们就会得到类型上的差异
然后使用从间隔中获取各个组件
SQL> select extract(day from intrvl) as dd,
2 extract(hour from intrvl) as hh24,
3 extract(minute from intrvl) as mi,
4 extract(second from intrvl) as ss
5 from (
6 select to_timestamp_tz ('Mon Dec 30 20:21:34 EST 2013','Dy Mon dd hh24:mi:ss TZR yyyy')
7 - to_timestamp_tz ('Sun Dec 29 11:55:29 EST 2013','Dy Mon dd hh24:mi:ss TZR yyyy') as intrvl
8 from dual
9 );
DD HH24 MI SS
---------- ---------- ---------- ----------
1 8 26 5
你看到了吗?你能分享上述日期的日期格式吗?日期没有“格式”。仅当显示值时才应用该格式。1)星期二和月日之间的名称将发生冲突(
ORA-01835
将引发错误)(星期二是2013年12月31日,而不是30日)当您尝试将第二个日期ED_DT
转换为日期数据类型的值时;2) 如果两个日期之间的差异超过12(24)小时,您希望以hh:mi:ss
格式输出什么?ED_DT=Mon Dec 30 20:21:34 EST 2013您能否分享如何将这些日期转换为日期数据类型
SQL> select extract(day from intrvl) as dd,
2 extract(hour from intrvl) as hh24,
3 extract(minute from intrvl) as mi,
4 extract(second from intrvl) as ss
5 from (
6 select to_timestamp_tz ('Mon Dec 30 20:21:34 EST 2013','Dy Mon dd hh24:mi:ss TZR yyyy')
7 - to_timestamp_tz ('Sun Dec 29 11:55:29 EST 2013','Dy Mon dd hh24:mi:ss TZR yyyy') as intrvl
8 from dual
9 );
DD HH24 MI SS
---------- ---------- ---------- ----------
1 8 26 5