powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сумма разностей timestamp-ов
14 сообщений из 14, страница 1 из 1
Сумма разностей timestamp-ов
    #36366614
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть таблица лога событий. Тип события - checkpoint. И атрибуты начала события begin_ts и конца end_ts заданные с точностью до долей секунд. Надо просуммировать время действия каждого события.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQL> desc calc_ln_checkp2;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER
 BEGIN_TS                                           TIMESTAMP( 6 )
 END_TS                                             TIMESTAMP( 6 )
 CHECKPT                                            VARCHAR2( 30 )
 PARENT_LINEID                                      NUMBER
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> SELECT Checkpt,SUBSTR(begin_ts, 1 , 30 ) "Time1",
   2          SUBSTR(end_ts, 1 , 30 ) "Time2",
   3          SUBSTR((end_ts-begin_ts), 1 , 30 ) "Difference"
   4   FROM calc_ln_checkp2 where rownum< 10 ;

CHECKPT                        Time1                          Time2                          Difference
------------------------------ ------------------------------ ------------------------------ ---------------------------
Point4                          14 -DEC- 09   03 . 59 . 20 . 038371  PM    14 -DEC- 09   03 . 59 . 20 . 042355  PM   + 000000000   00 : 00 : 00 . 003984 
Point7                          14 -DEC- 09   03 . 59 . 20 . 042661  PM    14 -DEC- 09   03 . 59 . 20 . 046140  PM   + 000000000   00 : 00 : 00 . 003479 
Point8                          14 -DEC- 09   03 . 59 . 20 . 046357  PM    14 -DEC- 09   03 . 59 . 20 . 053646  PM   + 000000000   00 : 00 : 00 . 007289 
Point1                          14 -DEC- 09   03 . 59 . 20 . 074469  PM    14 -DEC- 09   03 . 59 . 20 . 075773  PM   + 000000000   00 : 00 : 00 . 001304 
Point4                          14 -DEC- 09   03 . 59 . 20 . 076024  PM    14 -DEC- 09   03 . 59 . 20 . 080161  PM   + 000000000   00 : 00 : 00 . 004137 
Point7                          14 -DEC- 09   03 . 59 . 20 . 080476  PM    14 -DEC- 09   03 . 59 . 20 . 115668  PM   + 000000000   00 : 00 : 00 . 035192 
Point8                          14 -DEC- 09   03 . 59 . 20 . 116575  PM    14 -DEC- 09   03 . 59 . 20 . 135751  PM   + 000000000   00 : 00 : 00 . 019176 
Point1                          14 -DEC- 09   03 . 59 . 20 . 250907  PM    14 -DEC- 09   03 . 59 . 20 . 252267  PM   + 000000000   00 : 00 : 00 . 001360 
Point4                          14 -DEC- 09   03 . 59 . 20 . 252521  PM    14 -DEC- 09   03 . 59 . 20 . 256490  PM   + 000000000   00 : 00 : 00 . 003969 

 9  rows selected.

Однако timestamp почему-то оказался весьма неудобным типом для суммирования.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> SELECT Checkpt,SUM(SUBSTR((end_ts-begin_ts), 1 , 30 )) "Sum-Difference"
   2   FROM calc_ln_checkp2
   3   GROUP BY Checkpt;
SELECT Checkpt,SUM(SUBSTR((end_ts-begin_ts), 1 , 30 )) "Sum-Difference"
                   *
ERROR at line  1 :
ORA- 01722 : invalid number

SQL> SELECT Checkpt,SUM(end_ts-begin_ts) "Sum-Difference"
   2   FROM calc_ln_checkp2
   3   GROUP BY Checkpt;
SELECT Checkpt,SUM(end_ts-begin_ts) "Sum-Difference"
                         *
ERROR at line  1 :
ORA- 00932 : inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND

Преобразовывать в date не хочу т.к. теряю важные дробные значения.

Дайте совет, как быть.
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #36366620
А кто тебе сказал, что ты суммируешь таймштампы?
Даже без лупы видно, что суммируешь ты строки...
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #36366632
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну хорошо. Согласен. А во втором варианте? Как нужно трансформировать timestamp чтобы получить время в секундах и долях секунд?
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #36366639
Добрый Э - ЭхА кто тебе сказал, что ты суммируешь таймштампы?
Даже без лупы видно, что суммируешь ты строки...Это в первом случае.

А во втором ты пытаешься просуммировать временнЫе интервалы...
А SUM хочет на входе числовые типы данных(number, integer, т.д.)
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #36366667
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так рассуждаю. Если я из Date вычитаю Date - то должен получить NUMBER в виде дробного количества дней между датами. То-же самое по логике должно быть применимо к timestamp но просто с большей точностью.
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #36366672
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты не рассуждай, а загляни в доку
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #36366681
maytonЯ так рассуждаю. Если я из Date вычитаю Date - то должен получить NUMBER в виде дробного количества дней между датами. То-же самое по логике должно быть применимо к timestamp но просто с большей точностью.Ошибка твоих рассуждений в том, что разность двух TIMESTAMP-ов - есть ИНТЕРВАЛ ВРЕМЕНИ, а не число дней между датами
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #36366799
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonс точностью до долей секунд. Надо просуммировать время действия каждого события.STFF Среднее значение интервалов
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сумма разностей timestamp-ов
    #37319789
Skoffer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-- AVG and SUM aggregate functions for INTERVAL DAY TO SECOND values.
-- William Robertson 2004, www.williamrobertson.net
--
-- Since introducing the interval types in 9i, Oracle has neglected to overload the
-- aggregate functions SUM, AVG etc for them:
--
-- SQL> SELECT SUM(INTERVAL '1' SECOND) FROM dual
-- SELECT SUM(INTERVAL '1' SECOND) FROM dual
-- *
-- ERROR at line 1:
-- ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND
--
-- Until they get around to it, you can create your own:
--
-- SQL> SELECT SUM_DSINTERVAL(INTERVAL '1' SECOND) FROM dual;
--
-- SUM_DSINTERVAL(INTERVAL'1'SECOND)
-- ---------------------------------------------------------------------------
-- +000000000 00:00:01.000000000
--
-- 1 row selected.


CREATE OR REPLACE TYPE dsinterval_avg AS OBJECT
( total INTERVAL DAY TO SECOND
, items INTEGER
, STATIC FUNCTION ODCIAggregateInitialize
( sctx IN OUT dsinterval_avg )
RETURN NUMBER
, MEMBER FUNCTION ODCIAggregateIterate
( SELF IN OUT dsinterval_avg
, value IN INTERVAL DAY TO SECOND )
RETURN NUMBER
, MEMBER FUNCTION ODCIAggregateTerminate
( SELF IN dsinterval_avg
, returnvalue OUT INTERVAL DAY TO SECOND
, flags IN NUMBER )
RETURN NUMBER
, MEMBER FUNCTION ODCIAggregateMerge
( SELF IN OUT dsinterval_avg
, ctx2 IN dsinterval_avg )
RETURN NUMBER
);
/

show errors

CREATE OR REPLACE TYPE BODY dsinterval_avg
AS
STATIC FUNCTION ODCIAggregateInitialize
( sctx IN OUT dsinterval_avg )
RETURN NUMBER
IS
BEGIN
sctx := NEW dsinterval_avg(INTERVAL '0' SECOND, 0);
RETURN ODCIConst.Success;
END;


MEMBER FUNCTION ODCIAggregateIterate
( SELF IN OUT dsinterval_avg
, value IN INTERVAL DAY TO SECOND )
RETURN number
IS
BEGIN
SELF.total := SELF.total + value;
SELF.items := SELF.items + 1;
RETURN ODCIConst.Success;
END;


MEMBER FUNCTION ODCIAggregateTerminate
( SELF IN dsinterval_avg
, returnValue OUT INTERVAL DAY TO SECOND
, flags IN NUMBER )
RETURN NUMBER
IS
BEGIN
returnvalue := SELF.total / SELF.items;
RETURN ODCIConst.Success;
END;


MEMBER FUNCTION ODCIAggregateMerge
( SELF IN OUT dsinterval_avg
, ctx2 IN dsinterval_avg )
RETURN NUMBER
IS
BEGIN
-- The ODCIAggregateMerge function is used to combine results of
-- parallel queries. Presumably it is applied prior to DCIAggregateTerminate,
-- in which case it should probably combine totals from each thread.
-- Needs testing.

SELF.total := SELF.total + ctx2.total;
SELF.items := SELF.items + ctx2.items;

RETURN ODCIConst.Success;
END;
END;
/

show errors

-- Corresponding SUM aggregate:

CREATE OR REPLACE TYPE dsinterval_sum AS OBJECT
( total INTERVAL DAY TO SECOND
, STATIC FUNCTION ODCIAggregateInitialize
( sctx IN OUT dsinterval_sum )
RETURN NUMBER
, MEMBER FUNCTION ODCIAggregateIterate
( SELF IN OUT dsinterval_sum
, value IN INTERVAL DAY TO SECOND )
RETURN NUMBER
, MEMBER FUNCTION ODCIAggregateTerminate
( SELF IN dsinterval_sum
, returnvalue OUT INTERVAL DAY TO SECOND
, flags IN NUMBER )
RETURN NUMBER
, MEMBER FUNCTION ODCIAggregateMerge
( SELF IN OUT dsinterval_sum
, ctx2 IN dsinterval_sum )
RETURN NUMBER
);
/

show errors

CREATE OR REPLACE TYPE BODY dsinterval_sum
AS
STATIC FUNCTION ODCIAggregateInitialize
( sctx IN OUT dsinterval_sum )
RETURN NUMBER
IS
BEGIN
sctx := NEW dsinterval_sum(INTERVAL '0' SECOND);
RETURN ODCIConst.Success;
END;


MEMBER FUNCTION ODCIAggregateIterate
( SELF IN OUT dsinterval_sum
, value IN INTERVAL DAY TO SECOND )
RETURN number
IS
BEGIN
SELF.total := SELF.total + value;
RETURN ODCIConst.Success;
END;


MEMBER FUNCTION ODCIAggregateTerminate
( SELF IN dsinterval_sum
, returnValue OUT INTERVAL DAY TO SECOND
, flags IN NUMBER )
RETURN NUMBER
IS
BEGIN
returnvalue := SELF.total;
RETURN ODCIConst.Success;
END;


MEMBER FUNCTION ODCIAggregateMerge
( SELF IN OUT dsinterval_sum
, ctx2 IN dsinterval_sum )
RETURN NUMBER
IS
BEGIN
-- The ODCIAggregateMerge function is used to combine results of
-- parallel queries. Presumably it is applied prior to DCIAggregateTerminate,
-- in which case it should probably combine totals from each thread.
-- Needs testing.

SELF.total := SELF.total + ctx2.total;

RETURN ODCIConst.Success;
END;
END;
/

show errors

CREATE OR REPLACE FUNCTION sum_dsinterval
( input INTERVAL DAY TO SECOND )
RETURN INTERVAL DAY TO SECOND
PARALLEL_ENABLE
AGGREGATE USING dsinterval_sum;
/

SELECT SUM_DSINTERVAL(i) FROM ( SELECT t2 - t1 AS i FROM tstamp );


CREATE OR REPLACE FUNCTION avg_dsinterval
( input INTERVAL DAY TO SECOND )
RETURN INTERVAL DAY TO SECOND
PARALLEL_ENABLE
AGGREGATE USING dsinterval_avg;
/

SELECT AVG_DSINTERVAL(i) FROM ( SELECT t2 - t1 AS i FROM tstamp );
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сумма разностей timestamp-ов
    #39536767
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди, дак что, без создания функции мне разности интервалов не проссумировать?
Это эпически печально!
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #39536773
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--без создания функции мне разности интервалов не проссумировать?Разуваемся: 8068307
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #39536775
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоесть, разности таймстампов, ессно..
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #39536783
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicРазуваемся: 8068307 Elic, благодарю!
Но (не сочтите за дерзость), не считаете ли Вы, что для СУБД как Оракл, это-таки изврат?
...
Рейтинг: 0 / 0
Сумма разностей timestamp-ов
    #39536797
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--для СУБД как Оракл, это-таки изврат?Может для обобщаемости точность интервала маловата...
Код: plsql
1.
2.
3.
4.
5.
SQL> select numtodsinterval(999999999, 'day') + interval '1' day from dual;
select numtodsinterval(999999999, 'day') + interval '1' day from dual
                                  *
ERROR at line 1:
ORA-01873: the leading precision of the interval is too small

...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сумма разностей timestamp-ов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]