Получить «время с часовым поясом» из «времени без часового пояса» и имя часового пояса

Во-первых, я понимаю, что время с часовым поясом не рекомендуется. Я собираюсь использовать его, потому что я сравниваю несколько значений времени с часовым поясом с моим текущим системным временем независимо от дня. Т.е.пользователь говорит начать каждый день в 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 в свой Посмотреть.

25
задан Erwin Brandstetter 4 September 2015 в 19:51
поделиться