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

Rol*_*and 5 php postgresql

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

ERROR:  invalid input syntax for type timestamp: ""
Run Code Online (Sandbox Code Playgroud)

这是我的代码

$date = '2002-03-11';

$query = 'INSERT INTO dates(date) VALUES('.$pdo->quote($date).')';
$pdo->query($date);
Run Code Online (Sandbox Code Playgroud)

我完全不知道怎么做?

Eri*_*ric 9

您正在尝试插入时间戳.您需要将时间与日期连接起来.从Postgres文档:

时间戳类型的有效输入包括日期和时间的串联,后跟可选的时区,后跟可选的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';
Run Code Online (Sandbox Code Playgroud)


Gre*_*ith 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
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 5

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

ERROR:  invalid input syntax for type timestamp: ""
Run Code Online (Sandbox Code Playgroud)

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

ERROR:  invalid input syntax for type timestamp: "foobardtimestamp"
Run Code Online (Sandbox Code Playgroud)

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

ERROR:  invalid input syntax for type timestamp: "2002-03-11"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

INSERT INTO dates(date) VALUES('')
Run Code Online (Sandbox Code Playgroud)

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