2012-05-24 33 views
2

在我的SQLite-DB中,我想在星期一選擇所有條目。如何使用sqlite/sequel選擇星期一?

我該如何與續集做到這一點?

的實驗例:

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 I can do

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 ...)我認爲這是相同的問題和解決方案爲期一週的選擇也將解決我的其他問題。

回答

3

這裏有問題,你的例子:

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) 

由於您使用的是==,因此失敗。續集不會覆蓋==,而紅寶石的默認==返回false。在SQLite上,Sequel將false表示爲(1 = 0)

這應該工作:

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

此使用哈希(內{})的虛擬行塊內(外{})。在續集中,平等以哈希表示。

+0

再次感謝。我認爲它一定是我嘗試過的東西,但我沒有關於塊內散列的想法。 – knut

+0

我試過你的解決方案,但在我的'真實案例'中,我使用了'DateTime'而不是'Date'。如果在我的示例中插入'd = DateTime.parse(d.strftime(「%F%m:%d」))''之前,它不起作用。我實際做了一些實驗,也許有一個後續問題。 – knut

+0

好的,我找到了解決方案。我必須添加:'DB.use_timestamp_timezones = false'。背景信息在[續集]中(http://osdir.com/ml/sequel-talk/2011-09/msg00014.html)。一次出行:必須在添加內容之前完成設置(不起作用,如果您已添加了具有時區設置的條目)。 – knut