我的控制台是PST。 数据库服务器和存储的时间是GMT。
我不得不像这样运行查询:
SELECT x,y,z
FROM tbl_msg
WHERE (msg_datetime AT TIME ZONE 'BST') BETWEEN '2016-11-21'::date and '2016-11-22'::date;
索引101表示在 msg_datetime 上执行此操作现在将避免索引,这就是我所看到的。
所以我需要建议使用索引解决方案。
我能为这个时区编制索引吗?或者改变这个查询,以便它在BST中查询这些时间,转换为GMT?
答案 0 :(得分:0)
您应该拥有msg_datetime
类timestamp with time zone
列(或更短的别名timestamptz
)并且索引正常。
然后,要获得这两天的数据,您应该:
set timezone 'Europe/London'; -- once, on connection start
SELECT x,y,z
FROM tbl_msg
WHERE
msg_datetime>='2016-11-21 00:00:00'
and
msg_datetime<'2016-11-23 00:00:00';
你不应该使用普通的timestamp
,因为它存储文字日期和时间,而没有关于它实际意味着哪个时区的信息。 timestamp with time zone
类型会自动将客户端配置的时间转换为内部表示(以UTC表示)并返回。您还可以使用例如'2016-11-23 00:00:00 Asia/Tokyo'
来表达非默认时区的时间戳。
此外,您不应该使用BST
- 因为您需要在冬天使用GMT
并记住何时使用哪个。您应该使用“欧洲/伦敦”或其他“城市”时区(list),这些时区在夏季和冬季都是正确的。