#snowflake-cloud-data-platform
#платформа облачных данных snowflake
Вопрос:
Мы получаем данные в формате json с меткой времени, представленной в UTC. При преобразовании json в поле timestamp_tz он выполняется успешно (SQL выполняется в Австралии: 11 часов), однако, когда тот же результат преобразуется обратно в дату, он ссылается обратно на UTC и возвращает результат, который не соответствует дате timestamp_tz. Это оказывается проблемой при использовании с view и попыткой добавить предложение where xxx::date = ‘гггг-мм-дд’
Пример:
select jj:TransactionDatetime::TIMESTAMP_TZ full_date,
jj:TransactionDatetime::TIMESTAMP_TZ::date round_date,
jj:TransactionDatetime::TIMESTAMP_TZ::date = '2020-11-14' is_it_same_date
from
(
select parse_json('
{
"TransactionDatetime": "2020-11-13 23:26:31 00"
}'
) jj ) dd
Результат
FULL_DATE,ROUND_DATE,IS_IT_SAME_DATE
"2020-11-14 10:26:31.000","2020-11-13","false"
ПОЛНАЯ ДАТА — 14 ноября 2020 года с time potion, которая преобразуется из исходной временной метки json UTC
Предполагается, что ROUND_DATE представляет только часть даты из FULL_DATE. Он делает это, но использует представление UTC, и таким образом удаляет один день.
В результате, если у меня есть представление поверх этих данных, пользователи начинают использовать date в предложении «where» и получают неожиданный результат
Я ожидаю, что ROUND_DATE должно быть «2020-11-14»
Я думаю, что это неожиданное поведение, которое необходимо исправить в snowflake.Конечно, есть обходной путь, но он должен работать изначально.
Спасибо
Ответ №1:
Здесь:
alter session set timezone = 'Australia/Sydney';
select CURRENT_TIMESTAMP(); -- returns 2020-11-24 23:44:24.013 1100 as of now
select '2020-11-13 23:26:31 00'::TIMESTAMP_TZ as full_date; -- returns 2020-11-13 23:26:31.000 0000
select '2020-11-13 23:26:31 00'::TIMESTAMP_TZ::date as date_only; -- return 2020-11-13
select '2020-11-13 23:26:31 00'::TIMESTAMP_LTZ as full_date; -- returns 2020-11-14 10:26:31.000 1100
select '2020-11-13 23:26:31 00'::TIMESTAMP_LTZ::date as date_only; --returns 2020-11-14
Комментарии:
1. Спасибо Серджиу, он отлично работает при использовании TIMESTAMP_LTZ::date. Сеанс уже был «Австралия / Сидней»; TIMESTAMP_TZ отображает часовой пояс Au с учетом формата UTC, но любые операции со значением работают с исходным значением. Так что, если исходные данные поступают в UTC, лучше использовать LTZ.