【问题标题】:search by date on DBIx::Class在 DBIx::Class 上按日期搜索
【发布时间】:2011-04-11 01:23:06
【问题描述】:

我在 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 是否有办法,但没有找到。

谢谢

西蒙娜

【问题讨论】:

  • 作为一种解决方法,您可以选择时间戳>= Y-m-1 0:00< Y-(m+1)-1 00:00Time::Local 可用于将日期转换为秒。

标签: perl dbix-class


【解决方案1】:

您要查找的语法是:

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

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

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

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

这里是 the section of the SQL::Abstract docs 用于此构造。

【讨论】:

    【解决方案2】:

    我建议您改用search_literal

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

    编辑:我的立场是正确的。请参考@hobbs 的评论和回答。

    【讨论】:

    • 请不要,这是一个损坏的界面,正如您链接到的文档所说,还有另一种方法可以正常工作。
    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 2011-03-26
    • 2011-10-29
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多