【问题标题】:Oracle: Calculate time difference in HH:MM:SS between 2 dates [duplicate]Oracle:计算两个日期之间的 HH:MM:SS 时差 [重复]
【发布时间】:2014-01-01 09:25:23
【问题描述】:

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

ST_DT = 2013 年 12 月 29 日星期日 11:55:29 EST

ED_DT = 2013 年 12 月 30 日星期二 20:21:34 EST 2013

我想以 HH:MM:SS 格式查找这 2 个日期之间的差异。现在我的问题是我不知道如何在 Oracle 中解析上述日期格式。

【问题讨论】:

  • 你见过this吗??
  • 能分享一下以上日期的日期格式吗
  • 日期没有“格式”。该格式仅在显示值时应用。
  • 1) 星期的名称Tue 和月份的日期30 之间会有冲突(将引发ORA-01835 错误)(星期二是第31 天2013 年 12 月,而不是 30 日)当您尝试将第二个日期 ED_DT 转换为日期数据类型的值时; 2) 如果两个日期之间的时间差超过 12(24) 小时,您期望hh:mi:ss 格式的输出是什么?
  • ED_DT = Mon Dec 30 20:21:34 EST 2013 你能分享如何将此类日期转换为日期数据类型

标签: oracle date


【解决方案1】:

日期是 varchar2 类型吗?然后,您可以先将其转换为时间戳格式。由于它也有时区,请使用to_timestamp_tz 函数。

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

一旦日期是时间戳类型,减去它们会得到interval day to second 类型的差异。

SQL> select   to_timestamp_tz ('Mon Dec 30 20:21:34 EST 2013','Dy Mon dd hh24:mi:ss TZR yyyy')
  2         - to_timestamp_tz ('Sun Dec 29 11:55:29 EST 2013','Dy Mon dd hh24:mi:ss TZR yyyy') from dual;

TO_TIMESTAMP_TZ('MONDEC3020:21:34EST2013','DYMONDDHH24:MI:SSTZRYYYY')-TO_TI
---------------------------------------------------------------------------
+000000001 08:26:05.000000000

然后使用extract 从区间中获取各个分量。

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

【讨论】:

    【解决方案2】:

    我想出了一个解决方案,但它只适用于相同的时区日期。

    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;
    

    【讨论】:

      【解决方案3】:

      您可以使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 2021-11-25
        相关资源
        最近更新 更多