2

在我的 SQLite-DB 中,我想在星期一选择所有条目。

我怎样才能用续集做到这一点?

一个测试示例:

require 'sequel'

DB = Sequel.sqlite()#'test.db')
DB.create_table(:days) do
    String :text
    Date  :start
end

Date.today.upto(Date.today + 30){|d|
  DB[:days].insert( :text => d.strftime("%Y-%m-%d day %w in week %W"), :start => d)
}

如何选择所有星期一?

在本机SQL 中,我可以这样做

select * from days where strftime("%w", start) = "1"

使用它,我可以定义一个视图并为其选择:

DB.run('create view mondays as select * from days where strftime("%w", start) = "1"')
p DB[:mondays].all

但我想从 Sequel 中使用它。

我试过了

sel = DB[:days].filter{ start.strftime("%w", :start) == '1' }  
#NoMethodError

sel = DB[:days].filter{ Sequel::SQL::Function.new(:strftime, "%w", :start) == '1' }
#SELECT * FROM `days` WHERE (1 = 0)

但没有成功。

还有其他解决方案吗?

我也在寻找一种可能性,可以按一天中的小时选择项目(所有项目都有时间戳,然后是 12:00-13:00 ...)我认为这是同样的问题,也是当天的解决方案week-selection 也将解决我的其他问题。

4

1 回答 1

4

以下是您的示例的问题:

sel = DB[:days].filter{ start.strftime("%w", :start) == '1' }  
#NoMethodError

这使用了一个虚拟行,因此调用start返回一个Sequel::SQL::Identifier. 该Sequel::SQL::Identifier#strftime方法不存在,因此出现 NoMethodError。

sel = DB[:days].filter{ Sequel::SQL::Function.new(:strftime, "%w", :start) == '1' }
#SELECT * FROM `days` WHERE (1 = 0)

这失败了,因为您正在使用==. Sequel 不会覆盖==,并且 ruby​​ 的默认==返回false。在 SQLite 上,Sequel 表示false(1 = 0).

这应该有效:

sel = DB[:days].filter{{strftime("%w", :start) => '1'}}
# SELECT * FROM `days` WHERE (strftime('%w', `start`) = '1')

这在虚拟行块(外部 {})内使用哈希(内部 {})。在 Sequel 中,相等性由散列表示。

于 2012-05-24T19:54:13.650 回答