Извлечь часть даты из timestamptz - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь извлечь час из метки времени с помощью часового пояса. Тем не менее, мои времена подходят неправильно.

Вот пример, я использую Dbeaver с моим часовым поясом, установленным в EST:

SELECT '2020-01-24 14:27:12' AT TIME ZONE 'US/Pacific' as foo,
EXTRACT(HOUR FROM foo) as ex,
DATE_PART('HOUR', foo::timestamp) as dp

ВОЗВРАТЫ:

foo                 |ex |dp
2020-01-24 17:27:12 |22 | 22
  • Почему мое время приближается 3 часа вперед, это должно быть 3 часа позади?
  • Extract и DATE_PART, кажется, не получат меня час, который я хотел бы. Похоже, что он принимает 17 в качестве EST и затем конвертирует его в UT C. Вот что я ожидаю получить:
foo                 |ex |dp
2020-01-24 11:27:12 |11 | 11

Ответы [ 2 ]

1 голос
/ 25 января 2020

Проверьте, установлен ли ваш часовой пояс EST:

SELECT current_setting('TIMEZONE');

или с помощью:

show timezone;

Если это не так, вы можете установить его следующим образом:

set timezone to est;

Как показано в этом DEMO

Если это не работает, попробуйте с convert_timezone

select convert_timezone('US/Pacific', '2020-01-24 14:27:12')

И изучая материал под рукой, я обнаружил этот факт :

Примечание. Amazon Redshift не проверяет спецификации часового пояса в стиле POSIX, поэтому для часового пояса можно установить недопустимое значение. Например, следующая команда не возвращает ошибку, даже если для часового пояса установлено недопустимое значение.

установить часовой пояс на «xxx36»;

из этого источника : https://docs.aws.amazon.com/redshift/latest/dg/CONVERT_TIMEZONE.html

0 голосов
/ 25 января 2020

Это прекрасно работает для меня (с помощью dbVisualizer).

Проблема связана с вашим SQL клиентом.

SQL клиенты часто применяют форматирование, которое влияет на значения, которые вы видите. Вы можете проверить это, преобразовав значения в текст перед отправкой их вашему SQL клиенту:

SELECT
  '2020-01-24 14:27:12' AT TIME ZONE 'US/Pacific' as foo,
  foo::text as t,
  EXTRACT(HOUR FROM foo) as ex,
  DATE_PART('HOUR', foo::timestamp) as dp

Для меня это приводит к:

2020-01-24 22:27:12+00  2020-01-24 22:27:12+00  22.0    22.0

Попробуйте это в вашем SQL клиент и посмотрим, что получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...