为特定时区索引时间戳

时间:2016-12-01 20:05:34

标签: postgresql

我的控制台是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?

1 个答案:

答案 0 :(得分:0)

您应该拥有msg_datetimetimestamp 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),这些时区在夏季和冬季都是正确的。