4
A
回答
18
你列的数据类型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.
减去另一个时间戳,导致间隔数据类型:
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.
和间隔时间数据类型不能相加。这是一个恼人的限制:
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.
如果你愿意,你可以这个数字转换回间隔:
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.
Regards, Rob。
1
你可以(至少它的工作原理上的Oracle DB)使用此查询:
select sum(end_date - start_date) from your_table
2
编辑:前加入TRUNC()求和基于罗布面包车Wijk出色的答复。
要找到每行时间:
select
end_date-start_date as DurationDays,
(end_date-start_date)*24 as DurationHours,
(end_date-start_date)*24*60 as DurationMinutes,
(end_date-start_date)*24*60*60 as DurationSeconds
from your_table
要查找的总持续时间:
select
sum(trunc(end_date-start_date)) as TotalDurationDays
from your_table
要在一个查询一举两得:
select
end_date-start_date as DurationDays,
(select sum(trunc(end_date-start_date)) from your_table) as TotalDurationDays
from your_table
2
这对Oracle方法简单,一个黑客攻击的一位,但:
select sum((end_timestamp+0) - (start_timestamp+0))
from your_table
结果是天的NUMBER(有小数部分的小时,分钟和你知道的)。
我不知道什么时间戳+ 0确实;也许ANSI时间戳被转换为Oracle的早期时间戳类型,允许简单的算术。
相关问题
- 1. SQL持续时间计算
- 2. SQL查询:计算总计
- 3. SQL查询,计算时间
- 4. SQL Server中的查询持续时间估计
- 5. 计算持续时间
- 6. 持续时间计算
- 7. SQL查询来计算不同事件之间的平均持续时间
- 8. sp持续时间不等于sql profiler中语句持续时间的总和
- 9. sql查询计算两个连续行之间的时间差
- 10. 查找连续行和计算持续时间
- 11. SQL查询计算总
- 12. Hive中的持续时间计算
- 13. 计算sql中两个日期之间的持续时间
- 14. 计算上最后一行的总持续时间在MySQL
- 15. SQL Server 2005查询 - 计算总和
- 16. 在NHibernate Profiler中查询持续时间
- 17. 计算会话持续时间在Kibana
- 18. Microsoft SQL Server计算连续事件之间的总时间
- 19. 计算SQL查询的执行时间?
- 20. 时间戳和时间间隔:NUMTOYMINTERVAL SYSTDATE计算SQL查询
- 21. SQL查询来计算agroup的总和计算
- 22. 如何查询AudioQueue中的当前时间和持续时间
- 23. 计算一列中的时间戳之间的持续时间
- 24. 使用SQL计算页面的会话持续时间和时间
- 25. SQL事件探查器持续时间与SSMS持续时间
- 26. 在Google地图中计算距离和持续时间
- 27. 读wav文件,计算FO持续时间/ DATA_SIZE总是错误
- 28. 由于查看重新计算,LinQ查询的持续时间很长
- 29. 计算时间总和
- 30. 如何通过Laravel查询中的键来计算持续时间?
当我运行这个查询它说,不一致的数据类型。我使用oracle作为数据库。 – 2009-05-21 09:05:23
这很可能意味着您的start_date和end_date字段的类型不同,但如果您说可以计算每行的时间差异,则情况可能并非如此。 – Sevas 2009-05-21 09:16:05
的数据类型是时间戳 – 2009-05-21 09:17:27