【问题标题】:Query to convert datetime column to a different time zone查询以将日期时间列转换为不同的时区
【发布时间】:2015-06-27 03:37:36
【问题描述】:

我正在尝试组合日期、时间和时区,然后将其转换为 UTC 时区。

在下面的查询中,使用存储时区的数据库字段创建了一个错误 --- 即 t.timezone

t.timezone 的值为 Asia/Tokyo 。所有其他时区都采用类似的格式。

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';

【问题讨论】:

  • 您的服务器设置为哪个时区? m.last_mailing 存储在哪个时区? t.timezone 指的是哪些具体数据?那是m.last_mailing 的时区吗?请详细说明,因为这是给您正确答案所必需的。
  • m.last_mailing 是没有时区的时间戳
  • t.timezone 的值格式为 America/Barbados
  • 请参阅pg_timezone_names 了解可识别的时区字符串。

标签: postgresql timezone


【解决方案1】:

以下是按照您问题中的逻辑执行的查询。但是,很大程度上取决于如何设置各种数据的时区和您的服务器(另请参阅我对您问题的评论),因此您可能会发现您必须调整指定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';

还要注意正确的代码格式的美...

【讨论】:

  • 查询正在 Doctrine 中组装。我收到错误:预期的已知函数,得到 'date_trunc'
  • date_trunc 是一个内置函数,但AT TIME ZONE 子句可能会干扰;查看更新的答案。
  • 顺便说一句,你最好从上面的查询中创建一个视图(没有过滤器m.subscription_reference = '514'),然后将该视图用作 Doctrine 中的一个实体。与 Doctrine、HQL、ActiveRecord 等任何框架相比,PostgreSQL 在构建复杂查询方面有更多的选择。
  • 但是查询在 PostgreSQL 9.3 中运行得很好,有和没有显式转换。该功能已经存在了很长时间(至少从 8.4 开始)。你用的是哪个版本的 PG?
  • 我将使用视图进行调查
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2019-06-21
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 2016-08-29
相关资源
最近更新 更多