2011-04-10 69 views
0

我在SQLite數據庫中有一個表,其中列存儲文件mtimes在時代秒。在DBIx上按日期搜索::類

我現在想在該表中搜索在某個月被修改的文件嗎?

在原始的SQL,我會做:

select * from my_table where strftime('%Y-%m', mtime, "unixepoch") = "2009-08" 

有沒有辦法通過DBIx ::類有效地做到這一點?是否有可能做

$m->search({ \'strftime('%Y-%m', mtime, "unixepoch")' => "2009-08" }) 

我試圖瞭解是否有與DBIx ::類:: InflateColumn ::日期時間的方式,但我沒有找到它。

感謝

西蒙娜

+0

作爲一種解決方法,您可以選擇時間戳「> = Y-m-1 0:00」和「 Dallaylaen 2011-04-10 13:38:54

回答

5

你要找的語法是:

$m->search(
    \[ q{strftime('%Y-%m', mtime, "unixepoch") = ?}, "2009-08" ] 
); 

是的,這是一個基於陣列裁判 -REF。第一個元素是文字SQL,允許使用?佔位符,其餘元素是綁定到這些佔位符的值,DBIC將確保在內部重新排序所有內容,以便這些值在綁定列表中正確放置時查詢運行。

如果您需要結合這些與其他標準之一,由於arrayrefref是不是一個有效的哈希鍵,您需要使用-and語法:

$m->search({ 
    -and => [ 
    foo => 'bar', 
    \[ q{ SQL }, $bind ], 
    ], 
}); 

這是the section of the SQL::Abstract docs這個結構。

0

我會用search_literal,而不是建議你:

# assuming $m isa DBIx::Class::ResultSet 
$m->search_literal('strftime("%Y%m", mtime, "unixepoch") = ?', '200908'); 

編輯:我認錯。請參考@hobbs的評論和回答。

+1

請不要,這是一個破損的界面,因爲你鏈接到的文檔說,還有另一種方法來實現它,實際上正常工作。 – hobbs 2011-04-10 16:44:56