Det er ikke en fejl, det er en funktion... Der er to punkter her.
-
Erstatning af 'nu'
Lad os se på dokumentationen (Dato /Tidsfunktioner og operatører ):
Så
'now'
konverteres til et tidsstempel på parsetidspunktet. -
Udarbejdede erklæringer
Okay, men hvad betyder det med hensyn til funktioner? Det er nemt at demonstrere, at en funktion fortolkes, hver gang du kalder den:
t=# create function test() returns timestamp as $$ begin return 'now'; end; $$ language plpgsql; CREATE FUNCTION t=# select test(); test ---------------------------- 2015-12-11 11:14:43.479809 (1 row) t=# select test(); test ---------------------------- 2015-12-11 11:14:47.350266 (1 row)
I dette eksempel
'now'
opfører sig som forventet.Hvad er forskellen? Din funktion bruger SQL-sætninger, og test() gør det ikke. Lad os se på dokumentationen igen (PL/ pgSQL Plan Caching ):
Og her (Forbered erklæring ):
Derfor
'now'
blev konverteret til et tidsstempel, da forberedt sætning blev parset. Lad os demonstrere dette ved at oprette en forberedt erklæring uden for en funktion:t=# prepare s(integer) as UPDATE test_date_bug SET date2 = 'now' WHERE id = $1; PREPARE t=# execute s(1); UPDATE 1 t=# execute s(2); UPDATE 1 t=# select * from test_date_bug; id | date1 | date2 ----+-------------------------------+------------------------------- 3 | 2015-12-11 11:01:38.491656+03 | infinity 1 | 2015-12-11 11:01:37.91818+03 | 2015-12-11 11:40:44.339623+03 2 | 2015-12-11 11:01:37.931056+03 | 2015-12-11 11:40:44.339623+03 (3 rows)
Det er, hvad der skete. 'now'
blev konverteret til et tidsstempel én gang (når forberedt sætning blev parset), og now()
blev ringet op to gange.