Każdy kto pracuje z PostgreSQL używał wbudowanej funkcji NOW() – zwraca ona 'aktualny’ TimeStamp. Jednak czas jaki zwraca funkcja może w niektórych przypadkach nieco zmylić.
poniżej prosty select:
aljandor=# select now(); now ------------------------------- 2017-02-28 19:34:50.054909+00 (1 row) aljandor=# select now(); now ------------------------------- 2017-02-28 19:35:23.217189+00 (1 row)
zobaczmy co się stanie jeśli zawrzemy dwa powyższe selecty w transakcji:
aljandor=# BEGIN; BEGIN aljandor=# select now(); now ------------------------------- 2017-02-28 19:40:28.228707+00 (1 row) aljandor=# select now(); now ------------------------------- 2017-02-28 19:40:28.228707+00 (1 row) aljandor=# COMMIT; COMMIT
Zdziwiony? Dzieje się tak, iż funkcja now() zwraca time-samp czasu rozpoczęcia transakcji. Tak więc jeśli potrzebny nam dokładny znacznik czasu, użyjmy funkcji clock_timestamp():
aljandor=# BEGIN; BEGIN aljandor=# select clock_timestamp(); clock_timestamp ----------------------------- 2017-02-28 19:45:38.977532+00 (1 row) aljandor=# select clock_timestamp(); clock_timestamp ------------------------------- 2017-02-28 19:45:43.540535+00 (1 row) aljandor=# COMMIT; COMMIT
jak widać, funkcja zwraca zawsze aktualny time-stamp. Nieświadome używanie funkcji now() może powodować bardzo groźne sytuacje w przypadkach dla których ważne jest utrzymanie rzeczywistego znacznika czasu.