Как получить разницу дат между датой начала и датой окончания в oracle в виде часов и минут - PullRequest
0 голосов
/ 22 января 2020

У меня есть сценарий, в котором, например, мои start_date = '12 -SEP-2018 00:01:00 'и End_date = '13 -SEP-2018 14:55:00'. Разница между двумя датами должна быть указана в часах и минутах, например «12: 20». Это должно быть достигнуто в базе данных oracle. Я пытался использовать следующие логи c:

SELECT 24 * (to_date ('2009-07-07 22:00', 'YYYY-MM-DD hh24: mi') - to_date ('2009- 07-07 19:30 ',' ГГГГ-ММ-ДД чч24: ми ')) diff_hours FROM dual; Я смог получить разницу в часах, но не смог найти минут.

Ответы [ 2 ]

1 голос
/ 22 января 2020
CREATE TABLE table_name ( start_date DATE, end_date DATE );

INSERT INTO table_name VALUES ( TIMESTAMP '2009-07-07 19:30:00', TIMESTAMP '2009-07-07 22:00:00' );

Затем вы можете вычесть одно из другого и привести его к интервалу DAY TO SECOND, а затем просто EXTRACT составляющие времени:

SELECT EXTRACT( DAY    FROM difference ) AS days,
       EXTRACT( HOUR   FROM difference ) AS hours,
       EXTRACT( MINUTE FROM difference ) AS minutes,
       EXTRACT( SECOND FROM difference ) AS seconds
FROM   (
  SELECT ( end_date - start_date ) DAY TO SECOND AS difference
  FROM   table_name
);

Выходы:

DAYS | HOURS | MINUTES | SECONDS
---: | ----: | ------: | ------:
   0 |     2 |      30 |       0

или вы можете использовать арифмети c для вычисления значений:

SELECT TRUNC( 24 * ( end_date - start_date ) ) AS hours,
       TRUNC( MOD( 24 * 60 * ( end_date - start_date ), 60 ) ) AS minutes,
       ROUND( MOD( 24 * 60 * 60 * ( end_date - start_date ), 60 ) ) AS seconds
FROM   table_name;

, которые выводят:

HOURS | MINUTES | SECONDS
----: | ------: | ------:
    2 |      30 |       0

дБ <> скрипка здесь

0 голосов
/ 22 января 2020

Так как вы хотите получить строковое значение, альтернативой, основанной на вашей попытке запроса, является добавление разницы между вашими двумя значениями даты (которые являются числовым значением c, числом дней между ними, включая дробные дни) к произвольная фиксированная дата; и затем преобразовать результат этого в строку:

SELECT to_char(date '0001-01-01'
  + (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')),
  'HH24:MI') as diff
FROM dual;

DIFF 
-----
02:30

Если разница может превышать 24 часа, вам нужно решить, как сообщить об этом; если вы хотите включить дни в качестве отдельной цифры, вы все равно можете использовать этот подход, но вам нужно вычесть один (если ваша фиксированная дата является первой) из разницы перед форматированием в виде строки:

SELECT to_char(date '0001-01-01'
  + (to_date('2009-07-08 22:00', 'YYYY-MM-DD hh24:mi') - to_date( '2009-07-07 19:30', 'YYYY-MM-DD hh24:mi'))
  - 1,
  'DDD:HH24:MI') as diff
FROM dual;

DIFF     
---------
001:02:30

Если вы хотите, чтобы значение 'hours' было выше - например, '26: 30 'в этом примере - тогда оно становится более сложным; Я вижу, что @MTO уже добавил подход 'arithmeti c', поэтому я не буду повторять это. Но тогда может быть лучше пойти по маршруту extract() (который вы должны рассмотреть в любом случае, так как он более гибкий и элегантный ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...