Нужно вычесть несколько часов из заданной отметки времени в улье - PullRequest
0 голосов
/ 21 ноября 2018

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

Ожидаемый выходной сигнал с задержкой в ​​4 часа выше указанного времени ввода utcто есть 15.01.2008 11: 26: 37

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

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

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) 

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

В дополнение к ответ @ 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более подробную информацию можно найти здесь (обратите внимание на раздел «исправление ошибок»).

0 голосов
/ 21 ноября 2018

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

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') 
...