時間の計算をするSQL文をDBI(DBD::Pg)を使って実行しようとしたときにエラーになってハマりました。

my $v_time = "'2008-04-14 16:00:00'";
my $v_interval = "'-2 day'";
my $query = "SELECT TIMESTAMP ? + ?";
my $db_retref = $dbh->selectall_arrayref($query, undef, $v_time, $v_interval);

結果

selectall_arrayref failed: ERROR:  syntax error at or near "$1"
LINE 1: SELECT TIMESTAMP $1 + $2

結論としてはキャストをちゃんとすればOKのようです。(以下動くソース)

my $v_time = "'2008-04-14 16:00:00'";
my $v_interval = "'-2 day'";
my $query = "SELECT CAST(? AS TIMESTAMP) + CAST(? AS INTERVAL)";
my $db_retref = $dbh->selectall_arrayref($query, undef, $v_time, $v_interval);


参考文献

http://www.enterprisedb.com/docs/jp/8.3/server/typeconv-oper.html