【问题标题】:Ruby on Rails - Select records within date range (slow performance)Ruby on Rails - 选择日期范围内的记录(性能缓慢)
【发布时间】:2015-09-02 20:34:11
【问题描述】:

我知道如何查找某个日期范围内的记录,并且看到过类似问题的答案。我的问题是如何在一个查询中将我的日期值从“mm/dd/yy”重新格式化为可以与日期范围进行比较的格式。

我的数据库中有一个列,其中包含“mm/dd/yy”格式的日期。我正在尝试编写一个查询,它将选择由start_dateend_date 变量定义的日期范围内的所有记录,这些变量是Ruby Date 对象。

这是我目前最好的,但速度很慢:

date_records = Record.select { |r| ( (r.division == division) && (Date.strptime(r.date, "%m/%d/%y") >= start_date) && (Date.strptime(r.date, "%m/%d/%y") <= end_date) ) }

【问题讨论】:

  • 可能是stackoverflow.com/questions/2381718/… 的副本 是否有特殊原因直接使用 SQL 语句而不是 ActiveRecord 查询助手?
  • 没有理由...我可以使用.where。我的主要困难是从“mm/dd/yy”格式中获取日期以在查询中进行比较。这是我能做的最好的,而且很慢:date_records = Record.select { |r| ( (Date.strptime(r.date, "%m/%d/%y") &gt;= start_date) &amp;&amp; (Date.strptime(r.date, "%m/%d/%y") &lt;= end_date) ) }
  • 似乎第一项工作应该是将这些日期存储为日期,而不是字符串。

标签: mysql ruby-on-rails date


【解决方案1】:

我发现在执行 .select 解析和比较日期之前将我的记录转换为 JSON 大大提高了性能(约 35 秒至约 4 秒):

division_records = Record.where(division: division).as_json date_range_records = division_records.select { |r| ((start_date..end_date).include? Date.strptime(r["date"], "%m/%d/%y")) }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多