2015-06-27 4 views
2

Я пытаюсь собрать дату, время & часовой пояс, а затем преобразовать его в часовой пояс UTC.Запрос конвертировать столбец datetime в другой часовой пояс

В запросе ниже ошибки создается с полем базы данных, которая хранит временную зону --- а именно t.timezone

Значение t.timezone является Азия/Токио. Все остальные часовые пояса находятся в аналогичном формате.

select (select CONCAT(DATE(m.last_mailing at time zone 'utc' + INTERVAL '1 day'), ' ', MAKE_TIME(m.email_delivery_hour::int, 0, 0))::timestamp with time zone t.timezone) at time zone 'utc' FROM acts2301_membership.member_subscriptions m INNER JOIN acts2301_email_queue.timezone t ON (m.timezone_reference = t.reference) WHERE m.subscription_reference = '514'; 
+0

В какой часовой зоне установлен ваш сервер? В каком часовом поясе хранится 'm.last_mailing'? К каким конкретным данным относится «t.timezone»? Это часовой пояс 'm.last_mailing'? Пожалуйста, уточните, так как все это необходимо, чтобы дать вам правильный ответ. – Patrick

+0

m.last_mailing - временная метка без часового пояса –

+0

t.timezone имеет значения в формате America/Barbados –

ответ

2

Ниже представлен запрос, выполняемый в соответствии с логикой вашего вопроса. Однако многое зависит от того, как часовые пояса различных частей данных и сервер установлены (см также мой комментарий на ваш вопрос), так что вы можете обнаружить, что вам нужно настроить, где вы указываете t.timezone и где UTC:

SELECT ((date_trunc('day', (m.last_mailing AT TIME ZONE 'UTC')::timestamp) + 
     interval ('1 day') + 
     (m.email_delivery_hour::int::text || ':00:00')::time 
     )::timestamptz AT TIME ZONE t.timezone 
     )::timestamptz AT TIME ZONE 'UTC' 
FROM acts2301_membership.member_subscriptions m 
JOIN acts2301_email_queue.timezone t ON m.timezone_reference = t.reference 
WHERE m.subscription_reference = '514'; 

Также обратите внимание на красоту правильного форматирования кода ...

+0

Запрос собирается в Доктрине. Я получаю ошибку: ожидаемая известная функция, полученная 'date_trunc' –

+0

['date_trunc'] (http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC) является встроенная функция, но, возможно, интервал «AT TIME ZONE»; см. обновленный ответ. – Patrick

+0

Кстати, вам намного лучше создать представление из вышеуказанного запроса (без фильтра 'm.subscription_reference = '514''), а затем использовать это представление как объект в Доктрине. PostgreSQL имеет гораздо больше возможностей для построения сложных запросов, чем любые структуры, такие как Doctrine, HQL, ActiveRecord и т. Д. – Patrick

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