2009-05-21 106 views

回答

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 
+0

當我運行這個查詢它說,不一致的數據類型。我使用oracle作爲數據庫。 – 2009-05-21 09:05:23

+0

這很可能意味着您的start_date和end_date字段的類型不同,但如果您說可以計算每行的時間差異,則情況可能並非如此。 – Sevas 2009-05-21 09:16:05

+0

的數據類型是時間戳 – 2009-05-21 09:17:27

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的早期時間戳類型,允許簡單的算術。