Несоответствие вычисления функции unix_timestamp Hive

Я пытаюсь написать запрос Hive, который добавит 6 часов к значению метки времени, а затем сравнит его с другими метками времени.

Метод, который я использовал, - это преобразовать метку времени с помощью функции unix_timestamp(), а затем добавить к ней 21600 секунд, чтобы окончательное значение на 6 часов опережало исходное.

hive> select unix_timestamp('2014-11-02 00:58:20') from unix_tmp limit 1;
OK
1414907900

1414907900 + 6*60*60 = 1414929500

hive> select from_unixtime(1414929500) from unix_tmp limit 1;
OK
2014-11-02 05:58:20

Я думаю, что значение часа должно быть 06, а не 05. Что я делаю неправильно?

Кроме того, еще одно наблюдение заключается в том, что это верно не для всех значений; для некоторых значений приведенный выше расчет дает правильный результат.

Есть ли лучший метод для добавления часов и сравнения отметок времени?


person Anup    schedule 11.09.2015    source источник
comment
это в основном проблема с GMT..Time Zone, где время относительно GTM равно +1 или больше   -  person Catmandu    schedule 11.09.2015


Ответы (1)


Как говорится в docs:

unix_timestamp(string date)

Преобразует строку времени в формате гггг-ММ-дд ЧЧ: мм: сс в метку времени Unix (в секундах), используя часовой пояс по умолчанию и языковой стандарт по умолчанию, возвращает 0 в случае неудачи:

from_unixtime(bigint unixtime[, string format])

Преобразует количество секунд из эпохи unix (1970-01-01 00:00:00 UTC) в строку, представляющую метку времени этого момента в текущем часовом поясе системы в формате «1970- 01-01 00:00:00 ».


решение

from_utc_timestamp(timestamp, string timezone)

Предполагает, что заданная временная метка - это UTC и преобразуется в указанный часовой пояс (начиная с Hive 0.8.0). Например, from_utc_timestamp ('1970-01-01 08:00:00', 'PST') возвращает 1970-01-01 00:00:00.

to_utc_timestamp(timestamp, string timezone)

Предполагает, что данная временная метка находится в данном часовом поясе и преобразуется в UTC (начиная с Hive 0.8.0). Например, to_utc_timestamp ('1970-01-01 00:00:00', 'PST') возвращает 1970-01-01 08:00:00.

person luoluo    schedule 11.09.2015
comment
Спасибо за ответ, но я хочу проверить, является ли TimeStamp1 ›(TimeStamp2 + 6hrs) Как я могу это сделать - person Anup; 11.09.2015
comment
Если вы хотите сравнить time_stamp, просто сократите две time_stamp до unix_timestamp с помощью функции unix_timestamp(). - person luoluo; 11.09.2015
comment
Вы не добавляете час к отметке времени. Добавьте час к unix_timestamp, который является bigint. - person luoluo; 11.09.2015
comment
Это то, что я пытался в первую очередь; не получилось :-( - person Anup; 11.09.2015
comment
Сравнивать unix_timestamp результат - нормально. Ваша проблема заключается в том, чтобы вернуть unix_timestamp результат в time_stamp string. Вы можете использовать to_utc_timestamp, чтобы сделать time_stamp на той же основе. - person luoluo; 11.09.2015
comment
Позвольте нам продолжить это обсуждение в чате. - person Anup; 11.09.2015