如何计算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
我有一个 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