PHP / PDO无法绑定'TIMESTAMP WITHOUT TIME ZONE'值

时间:2013-10-17 21:27:56

标签: php postgresql pdo

我正在尝试使用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; ^

我知道PostgreSQL的to_timestamp()函数, 有效,但它返回TIMESTAMP WITH TIME ZONE - 问题是to_timestamp不是不可变函数(即,不根据服务器的时区配置返回不同的结果)。

同样,绑定以下内容可以实现我的目标,并且可以成功准备:

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

但我希望有更清洁/更简洁的东西。

我是否只是错误地准备了我的陈述,或者,如果这样做永远不会有效,那么从我的应用程序中的字符串到PostgreSQL中的TIMESTAMP WITHOUT TIME ZONE的替代方法是什么?

1 个答案:

答案 0 :(得分:1)

尝试直接使用括号进行投射,以避免混淆PDO / Postgres:

(?)::timestamp