【问题标题】:Postgres query with time zone带有时区的 Postgres 查询
【发布时间】:2017-08-17 09:37:39
【问题描述】:

我有每家公司都有各自时区的公司表。 例如 - 公司 1 的时区为 UTC+10 和 公司 2 - UTC+2

companies 有字段 time_zone 和存储的区域缩写,如 America/Los_Angeles(如果需要,我可以添加额外的字段来存储来自 UTC 的偏移值)。

并且有带有 start_date 字段的表请求,其中存储了没有时区的 TIMESTAMP (UTC-0) 例如 - id | company_id | start_date(utc-0) 1 1 21-03-16 02-00 // added for company `21-03-16 12-00` 2 2 21-03-16 23-00 // added for company `22-03-16 01-00` 3 1 20-03-16 13-00 // added for company `20-03-16 23-00` 4 1 21-03-16 23-00 // added for company `22-03-16 09-00

考虑到每个公司的时区,我想要选择从 21-03-16 00-00 到 21-03-16 23-59 开始的记录。

但如果我会使用 -

select * from request where start_date between '2016-03-21 00:00:00.000000' AND '2016-03-21 23:59:59.999999'

我收到 id = 2 和 4 的请求。

但事实上,这些请求是在 16 年 3 月 22 日为每个公司添加的。

有什么建议可以让我通过一个选择来决定这种情况吗?非常感谢。

【问题讨论】:

  • 喜欢request.start_date AT TIME ZONE companies.time_zone BETWEEN '2016-03-21 00:00:00Z' AND '2016-03-21 23:59:59.999999Z'?只有当每一行在time_zone 中都有一个 PostgreSQL 接受的时区时,OFC 才会起作用。你可以定义一个检查约束,比如CHECK ((timestamp '2000-01-01 00:00:00' AT TIME ZONE time_zone) IS NOT NULL)来验证time_zone

标签: postgresql date timezone psql


【解决方案1】:

我不确定我是否理解您的问题,您可能需要澄清一下。

但我想说加入存储时区信息的companies 应该可以解决问题:

SELECT r.*
FROM request r
   JOIN companies c ON c.id = r.company_id
WHERE r.start_date BETWEEN '2016-03-21 00:00:00.000000'
                           AT TIME ZONE c.time_zone
                       AND '2016-03-21 23:59:59.999999'
                           AT TIME ZONE c.time_zone;

【讨论】:

    猜你喜欢
    • 2012-02-06
    • 1970-01-01
    • 2021-11-21
    • 2017-09-25
    • 2017-04-16
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多