PostgreSQL add X months to a date

时间:2016-08-31 17:06:58

标签: php sql postgresql pdo

I try to add X month to the current datetime:

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

But I got:

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

What should be the correct syntaxe ?

Edit: seems it comes from my PHP prepare/execute syntax

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

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

1 个答案:

答案 0 :(得分:3)

The problem here is that you are trying to bind a variable with a SQL expression, which is not possible. You can only bind literal values. If you'd replace the binds out of what you showed, supposing $duree = 12, you'd get some SQL like this:

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

Which is clearly not correct, as 'NOW() + INTERVAL ''12 month''' is not a valid timestamp[tz], hence the error you get now.

As only the number of months is a parameter to you, you could simple multiple it as an integer with 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,
]);