如何计算oracle sql中两个日期之间HH:MM:SS的差异?

How to calculate the difference of HH:MM:SS between two dates in oracle sql?

我有一个 table abc 为:

-- start_time          |end_time             | total_time_taken
-- 27.05.2020 00:52:48 |27.05.2020 02:08:33  |  

我想将total_time_taken的值设置为end_time-start_time.的差值,格式为"HH:MM:SS"。我搜索了类似的主题,但没有找到确切的答案。

我的预期输出如下:01:44:12 (HH:MM:SS)

所以,我试过了:

SELECT To_Char(end_time,'HH24:MM:SS'),To_Char(start_time,'HH24:MM:SS'),
To_Char(end_time,'HH24:MM:SS')-To_Char(start_time,'HH24:MM:SS') FROM abc;

start_time、end_time、total_time_taken的数据类型是DATE.请帮我找到解决方案。

如果将这些日期转换为时间戳,您可以轻松地减去它们并看到相对不错的结果:

SQL> with test (st, et) as
  2    (select to_date('27.05.2020 00:52:48', 'dd.mm.yyyy hh24:mi:ss'),
  3            to_date('27.05.2020 02:08:33', 'dd.mm.yyyy hh24:mi:ss')
  4     from dual
  5    )
  6  select cast(et as timestamp) - cast(st as timestamp) diff
  7  from test;

DIFF
--------------------------------------------------------------------------
+000000000 01:15:45.000000

SQL>

如果你想按你想要的格式设置它(请注意,mm 格式掩码用于 个月 mi 用于 分钟),然后你可以做一些提取 - 再次从时间戳(不适用于日期):

SQL> with test (st, et) as
  2    (select to_date('27.05.2020 00:52:48', 'dd.mm.yyyy hh24:mi:ss'),
  3            to_date('27.05.2020 02:08:33', 'dd.mm.yyyy hh24:mi:ss')
  4     from dual
  5    ),
  6  diff as
  7    (select cast(et as timestamp) - cast(st as timestamp) diff
  8     from test
  9    )
 10  select extract(hour   from diff) ||':'||
 11         extract(minute from diff) ||':'||
 12         extract(second from diff) diff
 13  from diff;

DIFF
-------------------------------------------------------------------------
1:15:45

SQL>

你可以进一步让它变得漂亮(例如,两位数表示小时,使用 LPAD 函数)。或者,您甚至可以编写自己的函数,该函数实际上可以处理 DATE 数据类型值的差异,进行一些计算(使用 trunc 函数,减法,等等),但上面看起来很漂亮 优雅 如果与 自制功能相比

Littlefoot 的回答非常好。这个答案只是为了表明有不止一种方法可以得到结果。

首先,我们可以将一个日期与另一个日期相减,得到天数差异,然后将该差异转换为间隔。

with test (st, et) as
 (select to_date('27.05.2020 00:52:48', 'dd.mm.yyyy hh24:mi:ss'),
         to_date('27.05.2020 02:08:33', 'dd.mm.yyyy hh24:mi:ss')
  from dual
 )
select numtodsinterval(et-st, 'day') diff
from test;

然后,由于我们无法直接控制间隔格式,我们可以将 DIFF 添加到任意日期,然后使用内置日期格式。

with test (st, et) as
 (select to_date('27.05.2020 00:52:48', 'dd.mm.yyyy hh24:mi:ss'),
         to_date('27.05.2020 02:08:33', 'dd.mm.yyyy hh24:mi:ss')
  from dual
 )
select to_char(date '1-1-1' + numtodsinterval(et-st, 'day'), 'hh24:mi:ss') diff
from test;

DIFF    
--------
01:15:45