2016-10-03 6 views
0

Я хотел проверить некоторые отличия с меткой времени и меткой времени с полями часовых поясов. Но я наткнулся на то, что я не могу понять, почему он работает так.Хранить/извлекать временную метку с временной зоной или без нее

У меня есть следующие настройки:

CREATE TABLE tbl_test_timezones (
    first_date timestamp with time zone, 
    second_date timestamp 
) 

Я вставил некоторые Testdata:

insert into tbl_test_timezones (first_date, second_date) values (now(), now()); 

Теперь я хотел проверить разницу между этими двумя областями, когда я делаю выберите

select 
    first_date, 
    first_date at time zone 'Europe/Brussels' as first_date_wt, 
    second_date, 
    second_date at time zone 'Europe/Brussels' as second_date_wt 
from tbl_test_timezones 

which gives me the following result 

first_date:  2016-10-03 07:03:16.63818+00  
first_date_wt: 2016-10-03 09:03:16.63818 
second_date: 2016-10-03 07:03:16.63818 
second_date_wt: 2016-10-03 05:03:16.63818+00 

Вопрос 1

Мне интересно, почему second_date_wt делает -2 вместо +2, например first_date_wt?

Вопрос 2

Допустим моим приложение хранит метки времени с часовым поясом, и пользователь хочет получить некоторые записи с этой меткой времени. Вам нужно сохранить какие-то пользовательские настройки для пользователя, где он может ввести свой часовой пояс и всегда включать это в запрос выбора при их получении? Или вы предпочитаете просто получать его и делать это в часовом поясе в клиентском приложении?

, например:

select start_date at time zone (
    select user_time_zone from tbl_user_settings where user_id = 2 
) 
from tbl_projects 

или сделать только

select start_date 
from tbl_projects 

ответ

1

Ответ на вопрос 1

Эти два значения имеют различное значение.

first_date AT TIME ZONE 'Europe/Brussels' 

ответы: Что настенные часы показывают в Брюсселе на данный момент времени?

second_date AT TIME ZONE 'Europe/Brussels' 

ответы: В какой момент времени настенные часы в Брюсселе показывают это значение?

Ответ на вопрос 2

Лучший способ сделать это с помощью параметра конфигурации TimeZone к часовому поясу клиентского приложения. Тогда все timestamp with time zone значения будут показаны в этом часовом поясе, а timestamp without time zone значения будут интерпретироваться как значения в этом часовом поясе:

SHOW TimeZone; 

    TimeZone 
--------------- 
Europe/Vienna 
(1 row) 

SELECT 
    TIMESTAMP WITH TIME ZONE '2016-10-01 00:00:00 UTC' AS "midnight at UTC", 
    CAST(
     TIMESTAMP WITHOUT TIME ZONE '2016-10-01 00:00:00' 
     AS TIMESTAMP WITH TIME ZONE 
    ) AS "midnight local"; 

    midnight at UTC  |  midnight local 
------------------------+------------------------ 
2016-10-01 02:00:00+02 | 2016-10-01 00:00:00+02 
(1 row) 

SET TimeZone = 'America/Los_Angeles'; 

SELECT 
    TIMESTAMP WITH TIME ZONE '2016-10-01 00:00:00 UTC' AS "midnight at UTC", 
    CAST(
     TIMESTAMP WITHOUT TIME ZONE '2016-10-01 00:00:00' 
     AS TIMESTAMP WITH TIME ZONE 
    ) AS "midnight local"; 

    midnight at UTC  |  midnight local 
------------------------+------------------------ 
2016-09-30 17:00:00-07 | 2016-10-01 00:00:00-07 
(1 row) 
+0

ответы на первый вопрос простой способ запомнить разницу, спасибо! Также не знал, что вы можете установить часовой пояс с ключевым словом SET. Большой! Но что бы вы сделали, когда ваши клиенты находятся в разных часовых поясах, вы всегда делаете SET TIMEZONE = xxxxx для каждого запроса? – koala

+0

Если один сеанс должен обслуживать клиентов в разных часовых поясах, например, в пуле соединений, вам нужно будет устанавливать часовой пояс при каждом переключении клиентов. Но вы должны сделать то же самое в своем приложении, если будете обрабатывать часовые пояса в своем коде приложения, не так ли? –

+0

В моем случае у меня есть REST API, где клиент может подключиться. Поэтому, если я сохраняю отметки времени как «метка времени с зоной», и я получаю данные, мне нужно только установить клиентское приложение в правильный часовой пояс, чтобы показать правильное время, не так ли? Нет необходимости в том, чтобы мой бэкэнд знал, в какой временной зоне находится конечный пользователь? – koala

Смежные вопросы