Улей хранит временные метки в миллисекундах с эпохи Unix. Hive docs on timestamps на самом деле ошибочны, потому что это Unix Epoch по определению в UTC.
Временная метка, которую вы дали (1427673600000
), действительно соответствует 2015-03-30 00:00:00 UTC
. Если это тот момент, который вы намереваетесь сохранить, то вы делаете это правильно. Если на самом деле вы намеревались просто сохранить дату календаря (ссылаясь на дату всего, а не на полуночью UTC в эту дату), тогда вам, вероятно, следует использовать тип DATE
, сохраняя только 2015-03-30
.
Вы спрашиваете, почему cast(ts as timestamp)
дает 2015-03-30 02:00:00
. Что, вероятно, происходит здесь, является то, что время экспортировано с исходной меткой времени, но когда вы получаете, он загружается в тип, который показывает вам местный эквивалент времени.
Например, это может произойти с java.util.Date
. Вы должны уметь принимать это значение и интерпретировать его по-другому, либо с java.util.Calendar
, либо с Joda-Time, либо с новыми классами Java 8 java.time
. Если вы не используете Java, то аналогичный подход, вероятно, будет применяться. Дело в том, что вы, вероятно, используете Hive правильно, но локальный часовой пояс вводится при просмотре результатов.
ли мне нужно всегда сохранять метки времени в формате UTC в улье ...
Да, это лучшая практика, и это то, что вы делаете уже.
... так что в этом случае мне нужно вычесть 2 часа от того, что я получил ...
Нет, вы никогда не должны вручную добавить или вычесть время из метки времени. Это приведет вас к совершенно другому моменту времени.
... а затем я должен применить текущий часовой пояс во время запроса (используя from_utc_timestamp
)?
Я не совсем знаком с Улей.Если посмотреть на the docs for from_utc_timestamp
, то, похоже, это ожидает, что вход уже находится в метке времени, но они показывают пример с использованием строки. Возможно, это займет целое число, но тогда вы просто передали бы UTC
в качестве часового пояса, практически ничего не делая при преобразовании значений. Вероятно, у вас все еще будет такая же проблема, особенно если проблема на стороне приема. ИМХО, я не думаю, что вам следует использовать это.
Предыдущие метки времени всегда должны храниться как UTC. Исключением является то, что если вам также необходимо * также * необходимо сопоставить местное время, тогда вы сохраняете локальное время в отдельном поле или используете 'datetimeoffset', когда платформа поддерживает его. (Будущие времена - совсем другое дело.) Это в лучших практиках, связанных как дубликат. –
Спасибо за информацию. У вас есть какие-либо дополнения или рекомендации? – Bruckwald
Повторное открытие, чтобы добавить детали для Hive. (Первоначально отмечен как дуп [Лучшая практика летнего времени и часовых поясов] (http://stackoverflow.com/a/2532962/634824)) –