【问题标题】:PostgreSQL - extracting date ranges in local time?PostgreSQL - 提取当地时间的日期范围?
【发布时间】:2019-01-20 17:59:34
【问题描述】:

当前情况:

  • 我有一个带有timestamp with time zone (timestamptz) 字段的野火事件表,用于跟踪观察发生的时间。
  • 数据创建过程中的一切都是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 上选择,两边各有一天缓冲。那将使用索引,然后时区函数不会对太多数据进行排序(火灾季节每天约 6k 条记录)。 PG能解决这个问题吗?
  • 时区函数给了我 DST 偏移量(例如:丹佛目前是 UTC-06)。我想我会在 DST 结束后得到标准时间。如果我在 12 月对 8 月的数据运行查询,它将适用标准时间还是 DST?

谢谢!!!

【问题讨论】:

    标签: postgresql date datetime timezone localtime


    【解决方案1】:

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

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

    所以你应该在timezone(test_tz.tz, test_tz.ts_with)上创建第二个索引。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 2018-10-29
    • 1970-01-01
    • 2023-01-10
    • 2017-07-17
    • 2018-04-08
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多