Това не е грешка, а функция... Тук има два момента.
-
Замяна на „сега“
Нека да разгледаме документацията (Дата /Времеви функции и оператори ):
Така че
'now'
се преобразува в клеймо за време по време на анализ. -
Подготвени отчети
Добре, но какво означава по отношение на функциите? Лесно е да се демонстрира, че дадена функция се интерпретира всеки път, когато я извикате:
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)
В този пример
'now'
се държи както очаквате.Каква е разликата? Вашата функция използва SQL изрази, а test() не. Нека отново да разгледаме документацията (PL/ pgSQL план за кеширане ):
И тук (Подгответе изявление ):
Следователно
'now'
беше преобразуван в клеймо за време, когато подготвеният израз беше анализиран. Нека демонстрираме това, като създадем подготвен израз извън функция: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)
Ето какво се случи. 'now'
беше преобразуван в клеймо за време веднъж (когато подготвеният израз беше анализиран) и now()
беше извикан два пъти.