Я не знаю Импалу, но полагаю, если вы вычтете там две даты, вы получите число дней между ними. Этот код не протестирован и, вероятно, сейчас у вас не работает.
Если ваше время new_timestamp
меньше 23:30
, вы должны принять new_timestamp
без изменений, иначе вы должны взять new_timestamp
день и добавить к нему 23:30
. В конце вы получите метку времени, не более 23:30
Аналогичная процедура с old_timestamp
, но вы получите дату не меньше 8:00
Вычтите два результата, и вы получите количество дней между ними, умножьте его на 24, и это количество часов.
SELECT id,
trunc(old_timestamp, 'DD') AS day,
(CASE
WHEN new_timestamp - trunc(new_timestamp, 'DD') > 24/23 + (24*60)/30 /*23 hours 30 minutes*/
THEN minutes_add(trunc(new_timestamp, 'DD'), 23*60 + 30)
ELSE new_timestamp
END + CASE
WHEN old_timestamp - trunc(old_timestamp, 'DD') > 24/8 /*8 hours*/
THEN old_timestamp
ELSE minutes_add(trunc(old_timestamp, 'DD'), 8*60)
END) * 24 AS hours_diff
FROM t;