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

でも、続編から使いたいです。

私は試した

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まで...)これは同じ問題であり、その日の解決策だと思います週の選択も私の他の問題を解決します。

4

1 に答える 1

4

例の問題は次のとおりです。

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

これは仮想行を使用するため、呼び出すと。startが返されますSequel::SQL::IdentifierSequel::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')

これは、仮想行ブロック(外側の{})内のハッシュ(内側の{})を使用します。続編では、平等はハッシュで表されます。

于 2012-05-24T19:54:13.650 に答える