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

Jak funguje Transaction_timestamp() v PostgreSQL

V PostgreSQL, transaction_timestamp() funkce vrací aktuální datum a čas (včetně posunu časového pásma) na začátku aktuální transakce.

Je to ekvivalent tradiční funkce Postgres now() .

Je také podobný current_timestamp funkce (když je volána bez argumentu), kromě toho, že je pojmenována tak, aby jasně odrážela, co dělá.

transaction_timestamp() 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é transaction_timestamp() je nestandardní funkce SQL.

Syntaxe

Syntaxe vypadá takto:

transaction_timestamp()

Nejsou vyžadovány ani přijímány žádné argumenty.

Základní příklad

Zde je základní příklad k demonstraci.

SELECT transaction_timestamp();

Výsledek:

2020-07-02 08:23:08.810484+10

V rámci transakce

Zde je příklad demonstrující, jak to funguje v rámci transakce.

BEGIN;
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
COMMIT;

Zde je úplný výstup v mém terminálu při použití psql:

postgres=# BEGIN;
BEGIN
postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


postgres=# SELECT pg_sleep(5);
 pg_sleep 
----------
 
(1 row)


postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


postgres=# SELECT pg_sleep(5);
 pg_sleep 
----------
 
(1 row)


postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


postgres=# COMMIT;
COMMIT

Všechny tři časové hodnoty jsou stejné, i když pg_sleep() funkce byla použita ke zpoždění provedení mezi každým voláním transaction_timestamp() , 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 
  transaction_timestamp(),
  pg_sleep(5),
  transaction_timestamp(),
  pg_sleep(5),
  transaction_timestamp();

Výsledek (při použití vertikálního výstupu):

transaction_timestamp | 2020-07-02 09:15:56.154175+10
pg_sleep              | 
transaction_timestamp | 2020-07-02 09:15:56.154175+10
pg_sleep              | 
transaction_timestamp | 2020-07-02 09:15:56.154175+10

Opět platí, že všechny tři časové hodnoty jsou stejné, i když pg_sleep() funkce byla použita ke zpoždění provedení mezi každým voláním transaction_timestamp() .

To je v kontrastu s statement_timestamp() , což dělá změ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. MySQL Group_Concat() vs T-SQL String_Agg()

  2. Jednoduchá uvozovka, dvojitá uvozovka a zpětné zaškrtnutí v dotazech MySQL

  3. 2 způsoby, jak vrátit řádky, které obsahují pouze nealfanumerické znaky v MariaDB

  4. Připojení Oracle k PostgreSQL