PostgreSQL-在本地时间提取日期范围?

时间:2018-08-13 23:42:05

标签: postgresql date datetime timezone localtime

当前情况:

  • 我有一个野火事件表,其中有一个timestamp with time zone(时间戳)字段,用于跟踪观察发生的时间。
  • 数据创建过程中的所有内容都使用UTC:来自源的传入数据,用于插入数据的应用服务器,插入python代码(在时间后加上“ Z”)以及数据库服务器都位于世界标准时间。
  • 事件的地理范围跨越美国,加拿大和墨西哥的几个时区。

问题:

  • 我一直在查询UTC时间中一天的数据,但是需要提取相对于本地时间的数据。每个时区的午夜至午夜范围将有所不同。
  • 我的用例现在是一天,但是我被要求考虑任意时间范围。例如:查找当地时间一天中最热的部分(例如10:00至18:00)的所有事件。
  • 此表很大,我现在在timestamptz字段上有一个索引。我所做的任何更改都需要使用索引。
  • 说明夏令时。

我有一种获取每个记录的时区的方法,因此我不需要

我为此创建了一个测试表,其中包含时间戳字段ts_with和时区tz的varchar字段。以下查询返回我想要的内容,因此我感觉自己正在取得进步。

SELECT 
    name, test_tz.ts_with, test_tz.tz, 
    TIMEZONE(test_tz.tz, test_tz.ts_with) as timezone_with
FROM fire_info.test_tz
WHERE TIMEZONE(test_tz.tz, test_tz.ts_with) BETWEEN 
    '2018-08-07 00:00:00' AND '2018-08-07 23:59:59';

问题:

  • 这将使用我的索引吗?我认为时区功能可以避免这种情况。有什么解决办法吗?我正在考虑向where子句中添加另一个条件,该子句在timestamptz上选择,并由任一天缓冲一天。那将使用索引,然后时区功能不会对太多数据进行排序(在火灾季节每天约有6000条记录)。 PG会解决吗?
  • 时区功能为我提供了DST偏移量(例如:丹佛当前为UTC-06)。我想我将在DST结束后获得标准时间。如果我在12月对8月的数据进行查询,它将应用标准时间还是DST?

谢谢!

1 个答案:

答案 0 :(得分:1)

您编写查询的方式,它不能使用ts_with上的索引。

要使用索引,条件必须为ts_with <operator> <constant>形式,并且无法以这种方式重写查询。

因此,您应该在timezone(test_tz.tz, test_tz.ts_with)上创建第二个索引。