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});
Другие вопросы по тегам