2014-03-29 28 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

的問題是非常簡單的。您使用單引號查詢和字符串內部的引用。

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

正如已經指出的那樣,這是你的引用。然而,而不是使用雙引號「」作爲字符串封裝的另一種形式,我建議您使用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%的時間),那麼這就避免了不得不來回切換。