Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle:计算两个日期之间的时间差,单位为HH:MM:SS_Oracle_Date - Fatal编程技术网

Oracle:计算两个日期之间的时间差,单位为HH:MM:SS

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 '),

我有两个日期,格式如下:

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 '), '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