PHP/PDO 无法绑定“没有时区的时间戳”值


PHP/PDO can't bind 'TIMESTAMP WITHOUT TIME ZONE' values

我正在尝试使用 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的替代方法是什么?

尝试直接转换它,并用括号避免混淆PDO/Postgres:

(?)::timestamp