という名前の列を持つテーブルがありますduration
。そのデータ型はVARCHAR2
.
列を合計したいduration
。
00:56:30
02:08:40
01:01:00
合計=>04:05:10
ANSI SQL または Oracle SQL を使用してこれを行うにはどうすればよいですか?
を使用して時間、分、秒を分離しSUBSTR
、SUM
最後にNUMTODSINTERVAL
関数を使用して型に変換できますINTERVAL
。
SELECT NUMTODSINTERVAL (SUM (total_secs), 'second')
FROM (SELECT SUBSTR (duration, 1, 2) * 3600
+ SUBSTR (duration, 4, 2) * 60
+ SUBSTR (duration, 7, 2) total_secs
FROM user_tab);
INTERVAL
文字列を最初に変換し、これらの値を日付値として追加する方が良いと思います。次のようなもの:
select to_dsinterval('0 00:56:30')
+ to_dsinterval('0 02:08:40')
+ to_dsinterval('0 01:01:00') myinterval from dual;
MYINTERVAL
-------------------
+000000000 04:06:10
select
numtodsinterval(sum(
to_char(to_date(duration, 'HH24:MI:SS'), 'HH24') * 3600 +
to_char(to_date(duration, 'HH24:MI:SS'), 'MI') * 60+
to_char(to_date(duration, 'HH24:MI:SS'), 'SS')
), 'second'
) as SUMTOTAL
from tbl;
Second query
select
numtodsinterval(hr+mn+sc, 'second')
from
(
select
sum(to_char(to_date(duration, 'HH24:MI:SS'), 'HH24') * 3600) as hr,
sum(to_char(to_date(duration, 'HH24:MI:SS'), 'MI') * 60) as mn,
sum(to_char(to_date(duration, 'HH24:MI:SS'), 'SS'))as sc
from tbl) tmp
Example returning an object in SQL FIDDLE. try on your machine
Try this
select sec_to_time(sum(time_to_sec(duration))) from tbl
| SEC_TO_TIME(SUM(TIME_TO_SEC(DURATION))) |
-------------------------------------------
| January, 01 1970 04:06:10+0000 |