0

我在 SQLite 数据库中有一个表,其中一列以纪元秒为单位存储文件 mtimes。

我现在想在某个月份修改过的表文件中搜索?

在原始 SQL 中,我会这样做:

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

有没有办法通过 DBIx::Class 有效地做到这一点?有没有可能做

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

我尝试了解 DBIx::Class::InflateColumn::DateTime 是否有办法,但我没有找到。

谢谢

西蒙娜

4

2 回答 2

5

您正在寻找的语法是:

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

是的,这是一个数组-ref - ref 。第一个元素是允许使用?占位符的文字 SQL,其余元素是绑定到这些占位符的值,DBIC 将确保在内部重新排序所有内容,以便在绑定列表中将这些值放入正确的位置查询运行。

如果您需要将其中一个条件与其他条件结合起来,因为 arrayrefref 不是有效的哈希键,您需要使用以下-and语法:

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

这是此构造的 SQL::Abstract 文档部分。

于 2011-04-10T16:52:41.557 回答
0

我建议您search_literal改用:

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

编辑:我的立场得到纠正。请参考@hobbs 的评论和回答。

于 2011-04-10T15:40:03.940 回答