W PostgreSQL now()
funkcja zwraca bieżącą datę i godzinę (wraz z przesunięciem strefy czasowej), na początku bieżącej transakcji.
Jest to odpowiednik transaction_timestamp()
funkcja.
Jest również podobny do current_timestamp
funkcja (gdy wywołana bez argumentu).
now()
funkcja nie przyjmuje żadnych parametrów, więc nie można określić jej precyzji, natomiast current_timestamp
można wywołać z parametrem precyzji lub bez niego.
Również now()
nie jest zgodny ze standardem SQL (podobnie jak transaction_timestamp()
funkcja).
Składnia
Składnia wygląda tak:
now()
Żadne argumenty nie są wymagane ani akceptowane.
Przykład podstawowy
Oto podstawowy przykład do zademonstrowania.
SELECT now();
Wynik:
2020-07-02 09:51:12.088506+10
W ramach transakcji
Oto przykład pokazujący, jak to działa w ramach transakcji.
BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;
Oto pełne dane wyjściowe w moim terminalu podczas korzystania z psql:
postgres=# BEGIN;BEGINpostgres=# SELECT now(); teraz ------------------------------- 2020-07-02 09:51:53.905091+10(1 wiersz)postgres=# WYBIERZ pg_sleep(5); pg_sleep ---------- (1 wiersz)postgres=# SELECT now(); teraz ------------------------------- 2020-07-02 09:51:53.905091+10(1 wiersz)postgres=# WYBIERZ pg_sleep(5); pg_sleep ---------- (1 wiersz)postgres=# SELECT now(); teraz ------------------------------- 2020-07-02 09:51:53.905091+10(1 wiersz)postgres=# ZATWIERDZ; ZATWIERDZ
Wszystkie trzy wartości czasu są identyczne, mimo że pg_sleep()
funkcja została użyta do opóźnienia wykonania między każdym wywołaniem now()
, z których każda znajdowała się we własnej instrukcji SQL.
Widzimy więc, że czas zwracany dla każdego wyciągu jest oparty na czasie rozpoczęcia bieżącej transakcji, a nie na wyciągu. Nie zmienia się wraz z postępem transakcji.
Dzięki temu pojedyncza transakcja ma spójne pojęcie „bieżącego” czasu, dzięki czemu wiele modyfikacji w ramach tej samej transakcji ma ten sam znacznik czasu.
Wiele połączeń w wyciągu
Nie zmienia się również w miarę postępów w oświadczeniu.
\x
SELECT
now(),
pg_sleep(5),
now(),
pg_sleep(5),
now();
Wynik (przy użyciu wyjścia pionowego):
Ponownie, wszystkie trzy wartości czasu są identyczne, mimo że pg_sleep()
funkcja została użyta do opóźnienia wykonania między każdym wywołaniem now()
.
Jest to w przeciwieństwie do statement_timestamp()
, co robi zmienić z każdą instrukcją, a także clock_timestamp()
funkcja, która zmienia się nawet w miarę przechodzenia przez każdą instrukcję (jeśli jest wywoływana wiele razy w obrębie instrukcji).