2016-03-29 7 views
-1

Вместо того, чтобы всегда писать:Postgres, возвращающая DateTime со смещением часового пояса

select my_column at time zone 'UTC' at time zone 'Europe/Paris' from my_table; 

Я предпочитаю делать:

select dtz(my_column, 'Europe/Paris') from my_table; 

UTC в рамках всей системы (часовой пояс сервера), и может даже быть жестко закодированным в dtz().

Может ли кто-нибудь поделиться эффективной реализацией такой функции?

Редактировать

select my_column at time zone 'UTC' at time zone 'Europe/Paris' from my_table; 

Может быть сокращен очень и очень немного, как это:

select timezone('UTC', my_column) at time zone 'Europe/Paris' from my_table; 

ответ

1

Его действительно dificult, чтобы увидеть, что у вас возникли проблемы с на этом.

Я не верю, что часовой пояс сервера поможет вам здесь. Насколько я понимаю, это часовой пояс SQL-клиента, чем влияет на это.

Вы не собираетесь, чтобы получить функцию более эффективной, чем (IMMUTABLE):

RETURN arg1 AT TIME ZONE 'UTC' AT TIME ZONE arg2; 

Но это всегда будет менее эффективным, чем писать его встроенный в вашем SQL.

В идеале ваша метка времени должна быть TIMESTAMP WITH TIMEZONE вместо TIMESTAMP WITHOUT TIMEZONE, так как она используется для хранения абсолютных временных меток, а не локальных временных меток. Это предотвратит необходимость двух преобразований (в UTC и вне его). Но это означает, что вам нужно будет добавить AT TIME ZONE 'UTC' в ваши INSERT и UPDATE заявления.

+0

Спасибо за ваш ответ. Я бы использовал временную метку с часовым поясом, если мне удастся переместить Hibernate 5 в мое приложение (да, так или иначе), потому что ImprovedNamingStrategy ушла, и мне это нужно. Клиент в моем случае - это приложение Spring Boot, работающее на том же сервере, что и база данных. Для быстрого запроса я использую «в часовом поясе» в SQL-запросах, и я надеялся уменьшить объемность, используя функцию, описанную в моих вопросах. Но я согласен с вами, использование timestamp с часовым поясом было бы лучшим способом решить мою проблему. – yglodt

+0

Да, нет «эффективного» решения больше, чем подробный ... лучшая функция, основанная на одном, будет всего лишь одним слоем, как я указываю. –