Неожиданный результат при преобразовании json UTC во временную метку, а затем в дату

#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.