2015-06-27 69 views
2

我试图组装日期,时间&时区,然后将其转换为UTC时区。将日期时间列转换为不同时区的查询

在错误下面的查询与存储的时区数据库中的字段创建---即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.timezoneUTC

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

查询正在Doctrine中组装。我收到错误:预期的已知函数,得到'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'')创建一个视图,然后将该视图用作Doctrine中的一个实体要好得多。 PostgreSQL比构建复杂查询的选项要多得多,比如Doctrine,HQL,ActiveRecord等。 – Patrick

相关问题