|
|
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть таблица лога событий. Тип события - checkpoint. И атрибуты начала события begin_ts и конца end_ts заданные с точностью до долей секунд. Надо просуммировать время действия каждого события. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Однако timestamp почему-то оказался весьма неудобным типом для суммирования. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Преобразовывать в date не хочу т.к. теряю важные дробные значения. Дайте совет, как быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:37 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
А кто тебе сказал, что ты суммируешь таймштампы? Даже без лупы видно, что суммируешь ты строки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:39 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
Ну хорошо. Согласен. А во втором варианте? Как нужно трансформировать timestamp чтобы получить время в секундах и долях секунд? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:43 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
Добрый Э - ЭхА кто тебе сказал, что ты суммируешь таймштампы? Даже без лупы видно, что суммируешь ты строки...Это в первом случае. А во втором ты пытаешься просуммировать временнЫе интервалы... А SUM хочет на входе числовые типы данных(number, integer, т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:46 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
Я так рассуждаю. Если я из Date вычитаю Date - то должен получить NUMBER в виде дробного количества дней между датами. То-же самое по логике должно быть применимо к timestamp но просто с большей точностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:54 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
А ты не рассуждай, а загляни в доку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:55 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
maytonЯ так рассуждаю. Если я из Date вычитаю Date - то должен получить NUMBER в виде дробного количества дней между датами. То-же самое по логике должно быть применимо к timestamp но просто с большей точностью.Ошибка твоих рассуждений в том, что разность двух TIMESTAMP-ов - есть ИНТЕРВАЛ ВРЕМЕНИ, а не число дней между датами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 11:59 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
maytonс точностью до долей секунд. Надо просуммировать время действия каждого события.STFF Среднее значение интервалов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2009, 12:32 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
-- 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 ); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2011, 12:43 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
Люди, дак что, без создания функции мне разности интервалов не проссумировать? Это эпически печально! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2017, 11:27 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
--Eugene--без создания функции мне разности интервалов не проссумировать?Разуваемся: 8068307 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2017, 11:30 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
тоесть, разности таймстампов, ессно.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2017, 11:30 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
ElicРазуваемся: 8068307 Elic, благодарю! Но (не сочтите за дерзость), не считаете ли Вы, что для СУБД как Оракл, это-таки изврат? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2017, 11:38 |
|
||
|
Сумма разностей timestamp-ов
|
|||
|---|---|---|---|
|
#18+
--Eugene--для СУБД как Оракл, это-таки изврат?Может для обобщаемости точность интервала маловата... Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2017, 12:00 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39536767&tid=1885102]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
12ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 267ms |

| 0 / 0 |
