2011-04-10 67 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