Необходимо вычесть несколько часов из данной отметки времени в улье

Ввод: unix_timestamp ('01 / 15/2018 15:26:37 ',' мм / дд / ГГГГ чч: мм: сс ')

Ожидаемый результат - 4-часовая задержка от указанного выше времени ввода utc, т.е. 15.01.2018 11:26:37

Я знаю, что в улье есть функция date_sub, но она используется только для вычитания дней из заданной отметки времени. Но мне нужно знать, есть ли способ вычитать часы, минуты или секунды.

Я также пробовал что-то вроде ниже, поскольку часовой пояс EDT на 4 часа отстает от UTC (но получаю неправильный результат):

SELECT to_date(from_UTC_timestamp(unix_timestamp('01/15/2018 15:26:37', 'mm/dd/YYYY hh:mm:ss')*1000, 'EST6EDT')) as earliest_date; -- OUTPUT: 2017-12-31 (wrong) 

Так может ли кто-нибудь мне с этим помочь?


person Bhuvi007    schedule 21.11.2018    source источник


Ответы (2)


Работает нормально.

select from_unixtime(unix_timestamp('01/15/2018 15:26:37', 'MM/dd/yyyy HH:mm:ss')-4*3600, 'MM/dd/yyyy HH:mm:ss') 
person StrongYoung    schedule 21.11.2018

В дополнение к ответу @StrongYoung.

Я считаю очень полезным определять такие длинные выражения как макросы и помещать их в файл инициализации (например, hive -i init-file.hql ...).

hive> create temporary macro sub_hours(dt string, hours int)
from_unixtime(unix_timestamp(dt, 'MM/dd/yyyy HH:mm:ss') - 3600 * hours, 'MM/dd/yyyy HH:mm:ss');
OK
Time taken: 0.005 seconds
hive> select sub_hours("01/01/2019 00:00:00", 5);
OK
12/31/2018 19:00:00
Time taken: 0.439 seconds, Fetched: 1 row(s)

Макросы доступны начиная с Hive 0.12.0, дополнительную информацию можно найти здесь (обратите внимание на раздел" исправления ошибок ").

person GoodDok    schedule 04.07.2019