当前位置: 首页 > 知识库问答 >
问题:

甲骨文:计算两个日期之间的时间差,单位为HH:MM:SS[重复]

周鸿运
2023-03-14

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

ST_DT=太阳2013年12月29日11:55:29东部时间

ED_DT=Tue Dec30 20:21:34EST 2013

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

共有3个答案

东门俊民
2023-03-14

您可以使用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
吉毅
2023-03-14

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

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;
管弘
2023-03-14

日期是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

一旦日期是时间戳类型,减去它们就会得到间隔日与第二种类型的差异。

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

然后使用提取从间隔中获取单个组件。

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
 类似资料:
  • 问题内容: 我想计算年份和月份中两个datetime.date()日期之间的差异。 例如; 所需结果: 谢谢。 问题答案: 如果您能够安装出色的dateutil软件包,则可以执行以下操作:

  • 问题内容: 我在-type字段中将上次登录时间存储在MySQL中。当用户登录时,我想获取上次登录时间与当前时间(我使用)之间的时差。 我该如何计算? 问题答案: 使用MySQL函数。例如,您可以使用: 在您的情况下,函数的第三个参数将是当前登录时间()。第二个参数是上次登录时间,该时间已在数据库中。

  • 问题内容: 我已经看到了许多方法,如何根据特定的日期组件(例如,天,小时,月等)来计算两个日期之间的差异 我还没有看到的是如何使用实际Date对象进行计算。就像是 我已经看到了 iOS 10中引入的类型,但是根据文档DateInterval [it]不支持反向间隔,即持续时间小于0且结束日期在时间上早于开始日期的间隔。 这样就很难计算日期,尤其是当您不知道哪个是较早的日期时。 是否有任何干净整洁的

  • 问题内容: 我试图在几秒钟之内得到两个日期之间的差异。逻辑将是这样的: 设置一个初始日期,即现在; 设置最终日期,该日期将是初始日期加上将来的秒数(例如,假设15) 得到这两者之间的差(秒数) 之所以使用日期来做,是因为最终日期/时间取决于其他一些变量,并且永远不一样(取决于用户执行操作的速度),并且我还存储其他日期的初始日期。 我一直在尝试这样的事情: 问题是我永远都不会得到正确的区别。我尝试过

  • 问题内容: 如何计算2010年1月1日至2010年2月3日之间的日期? 问题答案: 编辑: 请记住,对象表示确切的时刻,它们没有任何关联的时区信息。当您使用例如一个字符串转换为日期时,从配置的时区的时间转换。因此,两个对象之间的秒数 始终 是时区不可知的。 此外,本文档还指定可可的时间实现方式不包含leap秒,因此,如果您需要这种准确性,则需要滚动自己的实现方式。

  • 问题内容: 我需要获取两个日期之间的分钟数。我知道Joda是最适合使用的,但这是针对Android项目的,因此,我更喜欢使用一些外部库,并且我正在构建的应用程序不需要计算得很精确。 但是,我正在使用的代码似乎无法正常工作。我正在尝试获取“ 11/21/2011 7:00:00 AM”和“ 11/21/2011 1:00:00 PM”之间的分钟数(应该为360分钟),但是代码我’m using返回0