Во-первых, я понимаю, что time with time zone
не рекомендуется. Я собираюсь использовать его, потому что сравниваю несколько значений time with time zone
с текущим системным временем, независимо от дня. То есть пользователь начинает каждый день в 08:00 и заканчивается в 12:00 с часовым поясом THEIR, а не системным часовым поясом. Таким образом, у меня есть столбец time without time zone
в одной таблице, позвоните ему SCHEDULES.time
, и у меня есть столбец UNIX time zone в другой таблице, позвоните ему 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
, я пытаюсь выполнить SELECT a time with time zone
, объединяя значения из имени часового пояса time without time zone
и text
.
ОБНОВЛЕНИЕ 3:
Спасибо всем, кто участвовал в их обсуждении.:) Я был убежден отказаться от моего плана использовать time with time zone
для моего вывода и вместо этого использовать timestamp with time zone
, поскольку он хорошо работает, более читабельен и решает другую проблему, с которой я столкнулся, часовые пояса, которые сверните в новые даты. IE. '2011-11-21 23:59' в 'America/Vancouver' - '2011-11-22' в 'America/Regina'.
ОБНОВЛЕНИЕ 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
в мое представление.