带时区的 Postgres 查询
Postgres query with time zone
我有 table 家公司,每家公司都有自己的时区。
例如 -
公司 1 的时区为 UTC+10,并且
公司 2 - UTC+2
table companies
有字段 time_zone 和存储的区域缩写,如 America/Los_Angeles
(如果需要,我可以为 UTC 的存储偏移值添加额外的字段)。
并且有 table 带有 start_date 字段的请求,其中存储了没有时区的时间戳 (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
考虑到每个公司的时区,我想要 select 从 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 的请求。
但这些请求实际上是在 22-03-16 为每个公司添加的。
有什么建议可以让我通过一个 select 来决定这种情况吗?非常感谢。
我不确定我是否理解你的问题,你可能需要澄清一下。
但我想说加入存储时区信息的 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;
我有 table 家公司,每家公司都有自己的时区。 例如 - 公司 1 的时区为 UTC+10,并且 公司 2 - UTC+2
table companies
有字段 time_zone 和存储的区域缩写,如 America/Los_Angeles
(如果需要,我可以为 UTC 的存储偏移值添加额外的字段)。
并且有 table 带有 start_date 字段的请求,其中存储了没有时区的时间戳 (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
考虑到每个公司的时区,我想要 select 从 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 的请求。
但这些请求实际上是在 22-03-16 为每个公司添加的。
有什么建议可以让我通过一个 select 来决定这种情况吗?非常感谢。
我不确定我是否理解你的问题,你可能需要澄清一下。
但我想说加入存储时区信息的 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;