Данные испытаний :
CREATE TABLE test_data ( id, value1, value2 ) AS
SELECT 1, TIMESTAMP '2019-09-30 00:00:00.000', TIMESTAMP '2019-09-30 00:05:00.000' FROM DUAL UNION ALL
SELECT 2, TIMESTAMP '2019-09-30 00:00:00.100', TIMESTAMP '2019-09-30 00:05:00.000' FROM DUAL UNION ALL
SELECT 3, TIMESTAMP '2019-09-30 00:00:00.000', TIMESTAMP '2019-10-01 00:05:00.000' FROM DUAL UNION ALL
SELECT 4, TIMESTAMP '2019-09-30 00:00:00.001', TIMESTAMP '2019-10-01 00:05:00.000' FROM DUAL;
Разница составляет 5 минут, 5 минут минус несколько микросекунд, 1 день и 1 день минус микросекунда.
Запрос :
Если вы просто наивно используете DATE
(используя CAST( value AS DATE)
или TRUNC( value, 'SS' )
), тогда вы получите неправильное значение, поскольку оно будет игнорировать любые доли секунды в вашемTIMESTAMP
s;вместо этого вы можете найти разницу между TIMESTAMP
s TRUNC
с точностью до ближайшей минуты (использование TRUNC
подразумевает неявное CAST
для DATE
типа данных), а затем добавить разницу между SECOND
компоненты:
SELECT id,
ROUND(
( TRUNC( value2, 'MI' ) - TRUNC( value1, 'MI' ) ) * 24 * 60
+ EXTRACT( SECOND FROM value2 ) / 60
- EXTRACT( SECOND FROM value1 ) / 60,
7
) AS time_difference_in_minutes
FROM test_data;
Выход :
ID | TIME_DIFFERENCE_IN_MINUTES
-: | -------------------------:
1 | 5
2 | 4.9983333
3 | 1440
4 | 1439.9999833
дБ <> скрипка здесь