[Perl] DBICでdatetime型カラムの検索条件ではまった件
DBICでdatetime型のカラムを使うときはInflateColumn::DateTimeを使ってinflate/deflate時に自動的にDateTimeクラスから/に変換してくれてとっても便利ですが、それに慣れっこで検索条件にdatetime型を指定するときは要注意です。
とはいっても、sqlite限定の問題。
sqlite> select id, username, created_on from users;
1|user1|2007-06-14 00:00:00
...
とかいうデータがあったとして
my $dt = DateTime->new(
year => 2007,
month => 6,
day => 14,
time_zone => 'local'
);
my $users = $schema->resultset('Users')
->search( { created_on => $dt} );
まぁ、当然といえば当然で
SELECT me.id, me.username, me.created_on FROM users me WHERE ( created_on = ? ): '2007-06-14T00:00:00'
とかSQLがはかれているので、sqliteではひっかりません。
やっかいなのはmysqlではdatetimeなフォーマットとして認識してくれて動いていたので、ちょっとはまりました。
直接formatterを指定してもいいのですが、ここはInflateColumn::DateTimeの挙動にあわせて
my $parser = $schema->storage->datetime_parser;
my $users = $schema->resultset('Users')
->search( { created_on => $parser->format_datetime($dt)} );
とかやればいいのかなぁと。
DBIx::Class::Storage::DBIDefines (returns) the datetime parser class - currently hardwired to DateTime::Format::MySQL
ということなので、今のところsqliteではDateTime::Format::MySQLを使われてる感じです。

Comments (1)
mqjkarrfuu6098uy
で
Lyndon Barber 2008.11.13 13:45