gpt4 book ai didi

sql - 计算sql查询中的持续时间总和

转载 作者:行者123 更新时间:2023-12-02 20:40:40 26 4
gpt4 key购买 nike

我有一个表,其中有两列开始时间和结束时间。我能够计算每行的持续时间,但我也想获得总持续时间。如何做到这一点。

谢谢

最佳答案

您的列的数据类型为 TIMESTAMP,如下所示:

SQL> create table mytable (start_time,end_time)
2 as
3 select to_timestamp('2009-05-01 12:34:56','yyyy-mm-dd hh24:mi:ss')
4 , to_timestamp('2009-05-01 23:45:01','yyyy-mm-dd hh24:mi:ss')
5 from dual
6 union all
7 select to_timestamp('2009-05-01 23:45:01','yyyy-mm-dd hh24:mi:ss')
8 , to_timestamp('2009-05-02 01:23:45','yyyy-mm-dd hh24:mi:ss')
9 from dual
10 union all
11 select to_timestamp('2009-05-01 07:00:00','yyyy-mm-dd hh24:mi:ss')
12 , to_timestamp('2009-05-01 08:00:00','yyyy-mm-dd hh24:mi:ss')
13 from dual
14 /

Tabel is aangemaakt.

用一个时间戳减去另一个时间戳,得到 INTERVAL 数据类型:

SQL> select start_time
2 , end_time
3 , end_time - start_time time_difference
4 from mytable
5 /

START_TIME END_TIME TIME_DIFFERENCE
------------------------------ ------------------------------ ------------------------------
01-05-09 12:34:56,000000000 01-05-09 23:45:01,000000000 +000000000 11:10:05.000000000
01-05-09 23:45:01,000000000 02-05-09 01:23:45,000000000 +000000000 01:38:44.000000000
01-05-09 07:00:00,000000000 01-05-09 08:00:00,000000000 +000000000 01:00:00.000000000

3 rijen zijn geselecteerd.

并且 INTERVAL 数据类型无法求和。这是一个烦人的限制:

SQL> select sum(end_time - start_time)
2 from mytable
3 /
select sum(end_time - start_time)
*
FOUT in regel 1:
.ORA-00932: inconsistente gegevenstypen: NUMBER verwacht, INTERVAL DAY TO SECOND gekregen

要规避此限制,您可以使用秒数进行转换和计算,如下所示:

SQL> select start_time
2 , end_time
3 , trunc(end_time) - trunc(start_time) days_difference
4 , to_number(to_char(end_time,'sssss')) - to_number(to_char(start_time,'sssss')) seconds_difference
5 from mytable
6 /

START_TIME END_TIME DAYS_DIFFERENCE SECONDS_DIFFERENCE
------------------------------ ------------------------------ --------------- ------------------
01-05-09 12:34:56,000000000 01-05-09 23:45:01,000000000 0 40205
01-05-09 23:45:01,000000000 02-05-09 01:23:45,000000000 1 -80476
01-05-09 07:00:00,000000000 01-05-09 08:00:00,000000000 0 3600

3 rijen zijn geselecteerd.

然后它们就是可以求和的正常数字

SQL> select sum
2 ( 86400 * (trunc(end_time) - trunc(start_time))
3 + to_number(to_char(end_time,'sssss')) - to_number(to_char(start_time,'sssss'))
4 ) total_time_difference
5 from mytable
6 /

TOTAL_TIME_DIFFERENCE
---------------------
49729

1 rij is geselecteerd.

如果您愿意,您可以将此数字转换回 INTERVAL:

SQL> select numtodsinterval
2 ( sum
3 ( 86400 * (trunc(end_time) - trunc(start_time))
4 + to_number(to_char(end_time,'sssss')) - to_number(to_char(start_time,'sssss'))
5 )
6 , 'second'
7 ) time_difference
8 from mytable
9 /

TIME_DIFFERENCE
------------------------------
+000000000 13:48:49.000000000

1 rij is geselecteerd.

问候,罗布。

关于sql - 计算sql查询中的持续时间总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/891833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com