Вычислить разницу во времени между двумя отметками времени на основе условий в Impala - PullRequest
1 голос
/ 13 июля 2020

Я использую Impala, и у меня есть таблица, отформатированная следующим образом:

ID        OLD_TIMESTAMP        NEW_TIMESTAMP
1234      2020-07-01 13:30     2020-07-01 18:00
2364      2020-07-02 07:30     2020-07-02 11:30
5746      2020-07-01 10:00     2020-07-03 12:30
5864      2020-07-10 23:45     2020-07-11 09:00

Мне нужно вычислить для каждого дня и каждого идентификатора разницу (в часах) между NEW_TIMESTAMP и OLD_TIMESTAMP, но учитывая только время с 08:00 до 23:30. Другими словами, это должен быть результат:

ID        DAY            HOURS_DIFF
1234      2020-07-01     4.5
2364      2020-07-02     3.5
5746      2020-07-01     13.5
5746      2020-07-02     15.5
5746      2020-07-03     4.5
5864      2020-07-11     1.0

Есть ли способ сделать это с помощью запроса SQL в Impala?

1 Ответ

0 голосов
/ 13 июля 2020

Я не знаю Импалу, но полагаю, если вы вычтете там две даты, вы получите число дней между ними. Этот код не протестирован и, вероятно, сейчас у вас не работает.

Если ваше время 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;
...