поиск по дате на DBIx :: Class - PullRequest
       5

поиск по дате на DBIx :: Class

0 голосов
/ 10 апреля 2011

У меня есть таблица в базе данных 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, но я не нашел его.

Спасибо

Simone

Ответы [ 2 ]

5 голосов
/ 10 апреля 2011

Синтаксис, который вы ищете:

$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 docs для этой конструкции.

0 голосов
/ 10 апреля 2011

Я бы посоветовал вам использовать search_literal вместо:

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

РЕДАКТИРОВАТЬ : Я исправлен.Пожалуйста, обратитесь к комментарию и ответу @hobbs.

...