Ruby on rails 在考虑时区的情况下查询日期时间范围
我在一个问题上遇到了很多麻烦。我真的不知道该怎么解释,但我会试试 基本上,我们有几个带有“posted_at”字段的对象,该字段将发布的日期和时间以及时区保存在datetime字段中。我需要查询并获取这些对象的日期范围 之前,我将其转换为Date,并将其与另一个Date对象进行比较。查询是这样的:Ruby on rails 在考虑时区的情况下查询日期时间范围,ruby-on-rails,performance,postgresql,datetime,timezone,Ruby On Rails,Performance,Postgresql,Datetime,Timezone,我在一个问题上遇到了很多麻烦。我真的不知道该怎么解释,但我会试试 基本上,我们有几个带有“posted_at”字段的对象,该字段将发布的日期和时间以及时区保存在datetime字段中。我需要查询并获取这些对象的日期范围 之前,我将其转换为Date,并将其与另一个Date对象进行比较。查询是这样的: Date(posted_at) >= :start_date AND Date(posted_at) <= :end_date Date(posted\u at)>=:start\u D
Date(posted_at) >= :start_date AND Date(posted_at) <= :end_date
Date(posted\u at)>=:start\u Date和Date(posted\u at)将开始时间和结束时间转换为UTC可能会更幸运,这将使时区在进行查询时几乎不相关。这很容易做到:
start_date.to_time.to_datetime.beginning_of_day.utc
end_date.to_time.to_datetime.end_of_day.utc
您还可以将查询调整为:
posted_at BETWEEN :start AND :end
请确保在您正在搜索的字段上也有索引,否则您将获得糟糕的性能。您永远不想在数据库中存储时区信息
这里有一篇文章讨论了一些陷阱:
正如tadman所建议的那样,您将获得更好的结果:在时区“utc”
处添加一个带有时间戳的新字段,并为其编制索引。然后你就可以使用posted\u在中间抓取东西了?而且?
该字段已编制索引,我尝试了这两种方法。但仍有一些超时:(它在log/development.log
中生成了什么查询?您是否尝试过在这个查询中使用EXAMINE
?它通常会突出显示哪里可能存在问题。我认为问题不是真正的查询,而是我们有数百万行……因为在比较日期时一切都正常工作,所以我与一些pe进行了交谈请点击此处,我们将创建一个新的索引列,只保留日期,同时考虑时区。感谢您的帮助和信息!我发现如果您创建一个date
字段,而不是datetime
,效果会更好,因为基数较低,所以这个建议当然值得一提。谢谢Denis,这就是r很值得知道。
posted_at BETWEEN :start AND :end