Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在考虑时区的情况下查询日期时间范围_Ruby On Rails_Performance_Postgresql_Datetime_Timezone - Fatal编程技术网

Ruby on rails 在考虑时区的情况下查询日期时间范围

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

我在一个问题上遇到了很多麻烦。我真的不知道该怎么解释,但我会试试

基本上,我们有几个带有“posted_at”字段的对象,该字段将发布的日期和时间以及时区保存在datetime字段中。我需要查询并获取这些对象的日期范围

之前,我将其转换为Date,并将其与另一个Date对象进行比较。查询是这样的:

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