无法使用数据类型时间戳将日期输入到postgres字段中

时间:2009-08-21 12:55:05

标签: php postgresql

我正在尝试将一个日期(“这是一个字符串”)插入到postgres数据库字段中。我收到以下错误

ERROR:  invalid input syntax for type timestamp: ""

这是我的代码

$date = '2002-03-11';

$query = 'INSERT INTO dates(date) VALUES('.$pdo->quote($date).')';
$pdo->query($date);

我完全不知道如何做到这一点?

3 个答案:

答案 0 :(得分:9)

您正在尝试插入时间戳。您需要将时间与日期连接起来。来自Postgres documentation

  

时间戳类型的有效输入   由日期的串联组成   和时间,然后是可选的   时区,然后是可选的AD   或BC。 (或者,AD / BC可以   出现在时区之前,但是这个   不是首选的排序。)因此

     

1999-01-08 04:05:06

     

     

1999-01-08 04:05:06 -8:00

     

有效   值,遵循ISO 8601   标准。

执行:

$date = '2002-03-11 12:01AM';

答案 1 :(得分:5)

我不确定你为什么会收到这个错误,引号中的值就像那样空。 PostgreSQL当然可以毫无次数地接受日期到时间戳字段。它们默认为“00:00:00”的时间,即当天的开始。

CREATE TABLE dates("date" timestamp);
INSERT INTO dates (date) VALUES ('2002-03-11');
SELECT * from dates;
        date         
---------------------
2002-03-11 00:00:00

你在这里做的一些事情并不完全正确,其中一些可能会改善你的情况:

  • 在实际应用程序中使用'quote'而不是预处理语句是允许SQL注入攻击进入代码的第一步,这是一个不好的习惯。你在这里得到一个错误的事实让我想知道PDO在这里中间是否做错了,如果你准备好了语句并且更直接地传递了值,那么这种情况就不太可能发生。
  • 你真的应该直接从字符串转换为时间戳,而不是依赖于隐式转换。直接SQL中的示例:

    INSERT INTO dates (date) VALUES (cast('2002-03-11' as timestamp));
    
  • 'date'是一个SQL reserved word。您不应该命名这样的字段,因为您最终可能需要在引号中包含对名称的引用,以便正确解析它们。

答案 2 :(得分:5)

您的错误似乎清楚地说明了问题所在:

ERROR:  invalid input syntax for type timestamp: ""

您的查询似乎正在尝试将空字符串插入到具有“timestamp”类型的PostgreSQL字段中。如果您要插入某种无效的字符串,它应该出现在您收到的错误中:

ERROR:  invalid input syntax for type timestamp: "foobardtimestamp"

或者,在您的情况下,如果您的预期字符串被传递,您的错误可能如下所示:

ERROR:  invalid input syntax for type timestamp: "2002-03-11"

...但错误并没有说明哪些让我怀疑你的字符串实际上并没有像你想象的那样传递给查询。事实是,如前所述:PostgreSQL应该完全能够将2002-03-11作为有效的时间戳字符串处理。

PostgreSQL不喜欢插入''(空字符串)作为时间戳,并会抱怨你提供的错误。

如果要提供空字符串,则需要确保列上没有NOT NULL约束,并且需要使用null而不是空字符串。如果你不想发送一个空字符串,我会检查$pdo->quote($date)的值,以确保你得到你想从那里返回的字符串。

您还可以在实际运行查询之前尝试输出生成的SQL,以确保它看起来正确。我有一种感觉,如果你这样做,它会看起来像这样:

INSERT INTO dates(date) VALUES('')

另外,对于它的价值,你的例子说你正在运行: 当我非常确定你想要的时候$pdo->query($date);$pdo->query($query);