带时区的 Postgres 查询

Art*_*m P 3 postgresql timezone date psql

我有公司表,其中每个公司都有单独的时区。例如 - 公司 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
Run Code Online (Sandbox Code Playgroud)

我想要选择从 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 的请求。

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

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

Lau*_*lbe 6

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

但我想说,加入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;
Run Code Online (Sandbox Code Playgroud)