首页 > 解决方案 > 带有时间戳的参数化查询上的 MonetDB-PHP 错误

问题描述

我正在将 MonetDB 与 MonetDB-PHP 库一起使用。

我遵循了以下文档:https ://github.com/MonetDB/MonetDB-PHP

一切正常,但如果我为时间戳类型列设置参数,我会收到以下错误:

来自 MonetDB 的错误:42000!函数调用的参数 1 的类型错误:char,预期的时间戳

例如,

这是有效的:

$result = $connection->Query(<<<EOF
    select
        *
    from
        "cats"
    where
        "name" = ?
        and "weight_kg" > ?
    limit
        10
EOF
, [ "D'artagnan", 5.3 ]);

但这不起作用:

$result = $connection->Query(<<<EOF
    select
        *
    from
        "cats"
    where
        "name" = ?
        and "weight_kg" > ?
        and "birthdate" < ?
    limit
        10
EOF
, [ "D'artagnan", 5.3, "2020-02-28 12:37:16" ]);

任何时间戳类型的列都会发生错误,并且仅在将值作为参数传递时才会发生。

我究竟做错了什么?

编辑:这是我正在使用的实际表

CREATE TABLE sys.url_data (
    userid varchar(50),
    groupid varchar(50),
    category varchar(50),
    url varchar(1024),
    datetime timestamp
);

“日期时间”是我在查询中使用的列

标签: phpsqlmonetdb

解决方案


已部署修复程序。更新到版本1.1.3。这些timestamp值必须作为DateTime对象传递。

使用您的示例表,如下所示:

$dt = DateTime::createFromFormat("Y-m-d H:i:s", "2020-02-28 12:37:16");

$result = $connection->Query(<<<EOF
    select
        *
    from
        sys.url_data
    where
        datetime > ?
EOF
, [ $dt ]);

要使用微秒:

$dt = DateTime::createFromFormat("Y-m-d H:i:s.u", "2020-02-28 12:37:16.123456");

还更新了有关准备好的声明的文档:


推荐阅读