Perl: ошибка DBI SQL с DATE_FORMAT
Надеюсь на некоторую помощь по этому вопросу, так как это далеко до раннего утра, и мой мозг еще не в полном рабочем состоянии.
Следующий оператор SQL действителен и дает желаемый результат, но при использовании в моем perl
Скрипт возвращает ошибку ниже.
my $stmt = 'SELECT DATE_FORMAT(completion_time, '%m') as 'month', COUNT(id) as 'total' FROM calls WHERE DATE_FORMAT(completion_time, '%Y') = ? GROUP BY DATE_FORMAT(completion_time, '%m')';
my $sth = database->prepare($stmt);
$sth->execute(params->{year});
ошибка
Uncaught exception from user code:
Unmatched ) in regex; marked by <-- HERE in m/) <-- HERE as / at /home/dev/Dancer/lib/new.pm line 507.
Compilation failed in require at ./bin/app.pl line 4.
я использую Dancer
и это плагин базы данных, но он отлично работает везде в приложении, так что это определенно проблема с моим синтаксисом или моим использованием DATE_FORMAT, но я не уверен, поскольку до сегодняшнего дня я не использовал DATE_FORMAT.
Как всегда любая помощь приветствуется и спасибо заранее.
3 ответа
Похоже, ваша цитата испорчена.
Попробуйте что-то вроде этого:
my $stmt = "SELECT DATE_FORMAT(completion_time, '%m') as 'month', ".
"COUNT(id) as 'total' FROM calls WHERE ".
"DATE_FORMAT(completion_time, '%Y') = ? ".
"GROUP BY DATE_FORMAT(completion_time, '%m')";
Как уже указывалось, это ваша цитата. Однако вместо использования двойных кавычек "" в качестве альтернативной формы инкапсуляции строк, я бы предложил использовать q{}
так что ваш sql все еще в одинарных кавычках:
my $stmt = q{SELECT DATE_FORMAT(completion_time, '%m') as 'month', COUNT(id) as 'total' FROM calls WHERE DATE_FORMAT(completion_time, '%Y') = ? GROUP BY DATE_FORMAT(completion_time, '%m')};
my $sth = database->prepare($stmt);
$sth->execute(params->{year});
Это гораздо лучшая техника, к которой можно прибегнуть. Это также верно для строк в двойных кавычках, используя qq{}
, Довольно часто смешивать одинарные и двойные кавычки в строке html, если ваши скобки сбалансированы (а это будет 99% времени), тогда вам не придется переключаться вперед и назад.
Проблема очень проста. Вы используете одинарные кавычки для запроса и для цитирования внутри строки.
my $stmt = "SELECT DATE_FORMAT(completion_time, '%m') as 'month', COUNT(id) as 'total' FROM calls WHERE DATE_FORMAT(completion_time, '%Y') = ? GROUP BY DATE_FORMAT(completion_time, '%m')";
my $sth = database->prepare($stmt);
$sth->execute(params->{year});