【问题标题】:PostgreSQL add X months to a datePostgreSQL 将 X 个月添加到日期
【发布时间】:2017-01-08 09:06:17
【问题描述】:

我尝试将 X 个月添加到当前日期时间:

UPDATE mytable SET thedate=NOW() + INTERVAL '12 month' WHERE id=1

但我得到了:

SQLSTATE[22007]: Invalid datetime format: 7 ERROR: invalid input syntax for timestamp: « NOW() + INTERVAL '12 month' »

正确的语法应该是什么?

编辑:似乎它来自我的 PHP 准备/执行语法

    $t = $connect->prepare('UPDATE mytable 
        SET thedate=:duree
        WHERE id=:id');

    $ok = $t->execute([
        ':duree' => "NOW() + INTERVAL '$duree month'",
        ':id'    => $user,
    ]);

【问题讨论】:

  • 你能分享一条英文错误信息吗?
  • 是的对不起,它是更新
  • 另外 - 你使用的是什么 postgres 版本?
  • 是的,你有什么对我有用。也许当您简化问题时,您就消除了问题?
  • 我编辑主​​题。看来问题来自 PDO 语法...

标签: php sql postgresql pdo


【解决方案1】:

这里的问题是您试图将变量与 SQL 表达式绑定,这是不可能的。您只能绑定文字值。如果您要替换显示的绑定,假设$duree = 12,您会得到一些类似这样的 SQL:

UPDATE mytable 
    SET thedate = 'NOW() + INTERVAL ''12 month'''
    WHERE id=:id

这显然是不正确的,因为'NOW() + INTERVAL ''12 month''' 不是有效的时间戳[tz],因此您现在得到的错误。

由于只有月数是您的参数,您可以简单地将其作为整数与interval '1 month' 相乘:

$t = $connect->prepare('UPDATE mytable 
    SET thedate = now() + (:duree  * interval '1 month')
    WHERE id=:id');

$ok = $t->execute([
    ':duree' => $duree,
    ':id'    => $user,
]);

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 2012-12-19
    • 1970-01-01
    • 2020-05-28
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多