2013-10-17 35 views
2

我正在嘗試使用PHP的PDO庫準備並執行對我的PostgreSQL數據庫的查詢,並且它不按預期工作。PHP/PDO無法綁定'TIMESTAMP WITHOUT TIME ZONE'值

當使用命令行psql客戶端,以下的作品爲人們所期望的:

=> SELECT TIMESTAMP WITHOUT TIME ZONE '2013-01-01 00:00:00'; 

     timestamp  
--------------------- 
2013-01-01 00:00:00 
(1 row) 

不過,我似乎並沒有能夠做到的使用PHP/PDO相同。下面的代碼:

<?php 
try 
{ 
    $db = new PDO(...); 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM); 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    $stmt = $db->prepare("SELECT TIMESTAMP WITHOUT TIME ZONE ?;"); 

    $stmt->bindValue(1, "2013-01-01 00:00:00", PDO::PARAM_STR); 
    $stmt->execute(); 

    $row = $stmt->fetch(); 

    echo $row[0]; 
} 
catch(PDOException $e) 
{ 
    die($e->getMessage()); 
} 
?> 

產生以下錯誤:

SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$1" LINE 1: SELECT TIMESTAMP WITHOUT TIME ZONE $1;^

我知道PostgreSQL的to_timestamp()功能,確實的工作,但它返回一個TIMESTAMP WITH TIME ZONE代替 - 問題在於to_timestamp ISN不可變的功能(即,根據服務器的時區配置不返回不同的結果)。

同樣,結合下面我想要做什麼,並且可以成功製備:

SELECT to_timestamp(?, 'YYYY-MM-DD HH24:MI:SS')::TIMESTAMP WITHOUT TIME ZONE; 

但我希望的東西更清潔/更簡潔。

難道我只是不正確地準備我的陳述,或者如果這永遠不會工作,從我的應用程序中的字符串到PostgreSQL中的TIMESTAMP WITHOUT TIME ZONE的替代方法是什麼?

回答

1

嘗試直接澆鑄,用括號避免混淆PDO/Postgres的:

(?)::timestamp 
+0

這精美的作品。謝謝!我很想提出一個針對PDO的錯誤 - 或者是語法'timestamp'2013-01-01 00:00:00''不是*意圖*因某種原因而工作? – CmdrMoozy

+0

我不確定它是否打算在沒有顯式轉換操作符的情況下工作,即使如此,您仍然可能需要在Postgres和其他適配器中使用括號(需要嘗試驗證,我會承認我沒有。) –

相關問題