【问题标题】:How do I search between two times?如何在两次之间进行搜索?
【发布时间】:2013-01-18 09:10:07
【问题描述】:

如何使用 Rails 和 ActiveRecord 比较 only 时间值?例如,查找下午 3:00 之后创建的所有行?

我尝试使用 Time.parse,但他们似乎期望的是完整的 DateTime 值,而不是时间(晚上 11:00 等)。

我基本上是在寻找两个日期之间存在的所有行,然后是两次之间。例如,在“3:00PM”之后创建的“21/01/2012”和“23/02/2012”之间创建的所有行。日期部分似乎工作正常,但我似乎无法在没有普通 SQL 的情况下让时间部分工作。

【问题讨论】:

  • 只是为了澄清似乎是一个假设:Time 包含日期和时间组件,就像 DateTime 类一样。了解两者之间的差异留作研究练习。

标签: ruby-on-rails ruby time rails-activerecord


【解决方案1】:

你可以这样做:

User.where("created_at > ? and created_at < ?", Time.now - 3.days, Time.now)

【讨论】:

  • 感谢您的回复,不幸的是,这不是我所追求的。我需要在指定时间之后开始的两个日期之间的所有记录。例如,所有在本财政年度下午 5:00 之后注销的人等。通常使用直接 SQL,您只需转换 datetime 值,我很好奇是否有 rails 方法可以做到这一点?不过感谢您的回答,我感谢您的努力。
  • 你的意思是这样的:User.all.select { |u| u.created_at.hour &gt; 15 } ?
  • 小心看起来像created_at &gt; ? and created_at &lt; ? 的逻辑。您的条件不允许精确的时间匹配。如果是 4:00 而created_at 是 4:00,你永远不会匹配它。使用created_at &gt;= ?created_at &lt;= ?
【解决方案2】:

据我了解,您正在应用一个函数来从 SQL 中的 datetime 属性中提取时间。类似select HOUR(created_at)...

ActiveRecord 无法做到这一点,但 gem squeel 在 Ruby 中做到了。

Person.select{coalesce(name, '<no name given>')}

但是没有什么比用纯 SQL 做的根本不同。

【讨论】:

  • 谢谢,会调查的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2021-07-06
  • 1970-01-01
  • 2011-02-13
相关资源
最近更新 更多