与Sequel一起获得当前月份

时间:2013-06-19 09:25:26

标签: sqlite date sequel

我想用Sequel恢复当月的条目列表, 我试着:

Entry.where(:date >= Date.month).sum(:duration)

Entry.where(:date.like('%/06/2013')).sum(:duration)

和其他......

但他们似乎都没有工作

提前致谢

2 个答案:

答案 0 :(得分:1)

如果您希望所有条目都是当前月份和当前年份,那么使用范围可能最容易:

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)

答案 1 :(得分:0)

您需要考虑数据库的思考方式,以及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输出,但我不知道你正在使用的数据库类型,而且,我很懒。

通常,您可以通过截断“now”来删除日期,然后查找截断日期与之匹配的所有时间戳,从而在DB内部玩弄技巧。这比DBM更具体,而不是使用Sequel,后者已经知道在将它们转换为“之间”类型语句时如何处理范围。