Во-первых, я понимаю, time with time zone
не рекомендуется. Я собираюсь использовать его, потому что я сравниваю несколько time with time zone
значений с моим текущим системным временем независимо от дня. То есть пользователь говорит, что начинать каждый день в 08:00 и заканчивать в 12:00 с ИХ часовым поясом, а не с системным часовым поясом. Итак, у меня есть столбец time without time zone
в одной таблице, назовем его SCHEDULES.time
, и у меня есть столбец Имя часового пояса UNIX в другой таблице, назовем его USERS.tz
.
Мой системный часовой пояс 'America/Regina'
, который не использует DST, поэтому смещение всегда равно -06
.
Учитывая время '12: 00: 00' и tz 'Америка / Ванкувер', я хотел бы выделить данные в столбец типа time with time zone
, но я НЕ хочу преобразовывать время в мое время. зона, потому что пользователь фактически сказал, начинайте в 12:00 в Ванкувере, а не в Регине.
Таким образом, делаем:
SELECT SCHEDULES.time AT TIME ZONE USERS.tz
FROM SCHEDULES JOIN USERS on USERS.ID=SCHEDULES.USERID;
Результаты (на данный момент) в:
'10:00:00-08'
но я очень хочу:
'12:00:00-08'
Я не могу найти никаких документов, касающихся применения часового пояса ко времени, кроме AT TIME ZONE
. Есть ли способ сделать это без манипуляций персонажем или других хаков?
UPDATE:
Это может быть достигнуто с помощью конкатенации строк, приведения и представления часового пояса Postgres следующим образом:
select ('12:00:00'::text || utc_offset::text)::timetz
from pg_timezone_names
where name = 'America/Vancouver';
Однако это довольно медленно. Должен быть лучший способ, нет?
ОБНОВЛЕНИЕ 2:
Я прошу прощения за путаницу. Таблица SCHEDULES
НЕ использует time with time zone
, я пытаюсь выбрать time with time zone
путем объединения значений из time without time zone
и text
имени часового пояса.
ОБНОВЛЕНИЕ 3:
Спасибо всем, кто участвовал в их (горячем) обсуждении. :) Я был убежден отказаться от моего плана использовать time with time zone
для моего вывода и вместо этого использовать timestamp with time zone
, поскольку он работает хорошо, более читабелен и решает другую проблему, с которой я собирался столкнуться, часовые пояса, которые катиться в новые даты. IE. «2011-11-21 23:59» в «Америка / Ванкувер» означает «2011-11-22» в «Америка / Регина».
ОБНОВЛЕНИЕ 4:
Как я уже говорил в своем последнем обновлении, я выбрал ответ, который @ MichaelKrelin-hacker первым предложил, а @JonSkeet окончательно определил. То есть timestamp with time zone
как мой окончательный вывод - лучшее решение. Я закончил с помощью запроса, как:
SELECT timezone(USERS.tz, now()::date + SCHEDULES.time)
FROM SCHEDULES
JOIN USERS ON USERS.ID = SCHEDULES.USERID;
Формат timezone()
был переписан Postgres после того, как я ввел (current_date + SCHEDULES.time) AT TIME ZONE USERS.tz
в свое представление.