2014-03-29 5 views
2

아침 일찍까지 내 머리가 아직 완전히 작동하지 않기 때문에이 문제에 대한 도움을 바랍니다.Perl : DATE_FORMAT의 DBI SQL 오류

다음 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을 사용하지 않았기 때문에 확실하지 않습니다.

항상 도움을 주시고 미리 감사드립니다.

+0

아마도 작은 따옴표를 이스케이프 처리해야합니다. –

답변

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')"; 
+0

고맙습니다. – MattSizzle

+0

큰 따옴표로 묶인 문자열에서'%'를 이스케이프 할 필요가 없습니다. –

+0

공정한 포인트 - 해시가 어쨌든 보간 할 것 같습니까? 편집 됨. – Rajit

0

문제는 매우 간단합니다. 질의와 String 내부의 인용에 대해서는 작은 따옴표를 사용합니다.

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}); 
2

이미 지적한 바와 같이 귀하의 인용문입니다.

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}); 

이 다시 빠져 들어가는 것이 더 나은 방법입니다 : 대신 문자열 캡슐의 대체 형태로 ""큰 따옴표를 사용하지만, 난 당신이 SQL은 여전히 ​​인용 한이되도록 q{}을 사용하는 것이 좋을 것 에. qq{}을 사용하여 큰 따옴표로 묶은 문자열에도 해당됩니다. html 문자열에 작은 따옴표와 큰 따옴표를 혼용하는 것이 일반적입니다. 따라서 중괄호가 균형을 이루는 한 (시간의 99 %가됩니다), 앞뒤로 전환하지 않아도됩니다.