我想用 Sequel 恢复当月的条目列表。
我试过了:
Entry.where(:date >= Date.month).sum(:duration)
或者
Entry.where(:date.like('%/06/2013')).sum(:duration)
和其他方式,但它们似乎都不起作用。
如果您想要当前月份和当前年份的所有条目,使用范围可能是最简单的:
d = Date.today
Entry.where(:date=> Date.new(d.year, d.month)...(Date.new(d.year, d.month) >> 1)).sum(:duration)
如果您想要任何一年中的当前月份,Sequel 已经内置了对此的支持:
Entry.where(Sequel.extract(:month, :date) => Date.today.month).sum(:duration)
您需要考虑数据库的思维方式,以及 Sequel 如何将 Ruby 范围转换为 SQL:
require 'date'
today = Date.today # => #<Date: 2013-07-03 ((2456477j,0s,0n),+0s,2299161j)>
first_of_month = (today - today.day) + 1
first_of_month # => #<Date: 2013-07-01 ((2456475j,0s,0n),+0s,2299161j)>
next_month = today + 31 # => #<Date: 2013-08-03 ((2456508j,0s,0n),+0s,2299161j)>
last_of_month = next_month - next_month.day # => #<Date: 2013-07-31 ((2456505j,0s,0n),+0s,2299161j)>
last_of_month # => #<Date: 2013-07-31 ((2456505j,0s,0n),+0s,2299161j)>
Entry.where(:date => [first_of_month .. last_of_month]).sum(:duration)
我会向您展示 SQL 输出,但我不知道您正在使用的数据库类型,而且,我很懒惰。
通常,您可以通过截断“现在”来删除日期,然后找到与截断日期匹配的所有时间戳,从而在数据库中发挥技巧。这比使用 Sequel 更具体到 DBM,后者在将范围转换为“between”类型语句时已经知道如何处理范围。