Není to chyba, je to funkce... Jsou zde dva body.
-
Nahrazení 'nyní'
Pojďme se podívat do dokumentace (Datum /Časové funkce a operátoři ):
Takže
'now'
je převeden na časové razítko v čase analýzy. -
Připravené výpisy
Dobře, ale co to znamená s ohledem na funkce? Je snadné demonstrovat, že funkce je interpretována pokaždé, když ji zavoláte:
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)
V tomto příkladu
'now'
chová se tak, jak jste očekávali.Jaký je rozdíl? Vaše funkce používá příkazy SQL a test() nikoli. Pojďme se znovu podívat do dokumentace (PL/ Ukládání plánu pgSQL do mezipaměti ):
A zde (Příprava prohlášení ):
Proto
'now'
byl převeden na časové razítko, když byl připravený příkaz analyzován. Pojďme si to ukázat vytvořením připraveného příkazu mimo funkci: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)
To se stalo. 'now'
byl převeden na časové razítko jednou (když byl připravený příkaz analyzován) a now()
byl volán dvakrát.