V PostgreSQL je to now()
funkce vrací aktuální datum a čas (včetně posunu časového pásma) na začátku aktuální transakce.
Je to ekvivalent transaction_timestamp()
funkce.
Je také podobný current_timestamp
funkce (při volání bez argumentu).
now()
funkce nepřijímá žádné parametry, takže nemůžete určit její přesnost, zatímco current_timestamp
lze volat s parametrem přesnosti nebo bez něj.
Také now()
je nestandardní SQL (stejně jako transaction_timestamp()
funkce).
Syntaxe
Syntaxe vypadá takto:
now()
Nejsou vyžadovány ani přijímány žádné argumenty.
Základní příklad
Zde je základní příklad k demonstraci.
SELECT now();
Výsledek:
2020-07-02 09:51:12.088506+10
V rámci transakce
Zde je příklad demonstrující, jak to funguje v rámci transakce.
BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;
Zde je úplný výstup v mém terminálu při použití psql:
postgres=# BEGIN; BEGIN postgres=# SELECT now(); now ------------------------------- 2020-07-02 09:51:53.905091+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT now(); now ------------------------------- 2020-07-02 09:51:53.905091+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT now(); now ------------------------------- 2020-07-02 09:51:53.905091+10 (1 row) postgres=# COMMIT; COMMIT
Všechny tři časové hodnoty jsou identické, i když pg_sleep()
funkce byla použita ke zpoždění provedení mezi každým voláním now()
, z nichž každý byl náhodou ve svém vlastním příkazu SQL.
Můžeme tedy vidět, že čas vrácený pro každý výpis je založen na počátečním čase aktuální transakce – nikoli na výpisu. V průběhu transakce se nemění.
To umožňuje, aby jedna transakce měla konzistentní představu o „aktuálním“ čase, takže více úprav v rámci stejné transakce nese stejný časový údaj.
Více hovorů v rámci výpisu
Nemění se ani v průběhu výpisu.
\x
SELECT
now(),
pg_sleep(5),
now(),
pg_sleep(5),
now();
Výsledek (při použití vertikálního výstupu):
now | 2020-07-02 09:53:33.766806+10 pg_sleep | now | 2020-07-02 09:53:33.766806+10 pg_sleep | now | 2020-07-02 09:53:33.766806+10
Opět platí, že všechny tři časové hodnoty jsou totožné, i když pg_sleep()
funkce byla použita ke zpoždění provedení mezi každým voláním now()
.
To je v kontrastu s statement_timestamp()
, což dělá měnit s každým příkazem a také clock_timestamp()
funkce, která se mění, i když postupuje každým příkazem (pokud je v rámci příkazu volána vícekrát).