Так как вы хотите получить строковое значение, альтернативой, основанной на вашей попытке запроса, является добавление разницы между вашими двумя значениями даты (которые являются числовым значением 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()
(который вы должны рассмотреть в любом случае, так как он более гибкий и элегантный ...)