Во-первых, я понимаю, что время с часовым поясом
не рекомендуется. Я собираюсь использовать его, потому что я сравниваю несколько значений времени с часовым поясом
с моим текущим системным временем независимо от дня. Т.е.пользователь говорит начать каждый день в 08:00 и закончить в 12:00 с ИХ часовым поясом, а не системным часовым поясом. Итак, у меня есть столбец время без часового пояса
в одной таблице, назовем его SCHEDULES.time
, и у меня есть столбец UNIX имя часового пояса в другой таблице. , назовем его USERS.tz
.
Часовой пояс моей системы - 'America / Regina'
, в котором не используется летнее время, поэтому смещение всегда равно -06
.
Учитывая время «12: 00: 00» и tz «Америка / Ванкувер», я хотел бы выбрать данные в столбце типа время с часовым поясом
, но я НЕ хочу чтобы преобразовать время в мой часовой пояс, потому что пользователь фактически сказал начать в, когда в Ванкувере 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'
Я не могу найти никакой документации, относящейся к применению часового пояса ко времени, кроме В ЧАСОВОЙ ПОЯС
. Есть ли способ сделать это без манипуляций с персонажами или других хаков?
ОБНОВЛЕНИЕ: Этого можно добиться, используя конкатенацию строк, приведение типов и представление часового пояса Postgres как таковое:
select ('12:00:00'::text || utc_offset::text)::timetz
from pg_timezone_names
where name = 'America/Vancouver';
Однако это довольно медленно. Должен быть способ получше, не так ли?
ОБНОВЛЕНИЕ 2:
Прошу прощения за недоразумение. Таблица SCHEDULES
НЕ ИСПОЛЬЗУЕТ время с часовым поясом
, я пытаюсь ВЫБРАТЬ время с часовым поясом
, комбинируя значения из времени без времени зона
и текст
название часового пояса.
ОБНОВЛЕНИЕ 3:
Спасибо всем участникам за их (бурное) обсуждение. :) Я был убежден отказаться от моего плана использовать время с часовым поясом
для вывода и вместо этого использовать метку времени с часовым поясом
, поскольку он работает хорошо, более читабелен и решает другую проблему, с которой я собирался столкнуться, - часовые пояса, переходящие в новые даты. IE. «2011-11-21 23:59» в «Америка / Ванкувер» означает «2011-11-22» в «Америка / Реджайна».
ОБНОВЛЕНИЕ 4:
Как я сказал в своем последнем обновлении, я выбрал ответ, который первым предложил @ MichaelKrelin-hacker, а завершил @JonSkeet. То есть временная метка с часовым поясом
в качестве моего окончательного результата является лучшим решением. В итоге я использовал такой запрос:
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
в свой Посмотреть.