3

PHP の PDO ライブラリを使用して、PostgreSQL データベースに対してクエリを準備および実行しようとしていますが、期待どおりに動作しません。

コマンド ライン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; ^

問題は、不変の関数でto_timestamp()ない(つまり、サーバーのタイムゾーン設定に基づいて異なる結果を返さない) ことです。TIMESTAMP WITH TIME ZONEto_timestamp

同様に、以下をバインドすると、私が望むことが実行され、正常に準備できます。

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

しかし、私は何かよりクリーンで冗長でないことを望んでいます。

ステートメントを間違って準備しているだけですか、それともうまくいかない場合、アプリケーションの文字列からTIMESTAMP WITHOUT TIME ZONEPostgreSQL に移行する別の方法は何ですか?

4

1 に答える 1