sql >> Databáze >  >> RDS >> PostgreSQL

Jak Now() funguje v PostgreSQL

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).


  1. Rozdíl ve výkonu:podmínka umístěná v klauzuli INNER JOIN vs. WHERE

  2. Vývoj odolnosti vůči chybám v PostgreSQL:Replikační fáze

  3. Práce s daty ODBC v DbVisualizer

  4. Architektura SQL Server AlwaysOn (skupina dostupnosti) a instalace krok za krokem -4 Přidání a odebrání databáze Kroky