sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur statement_timestamp() fungerar i PostgreSQL

I PostgreSQL, statement_timestamp() funktion returnerar aktuellt datum och tid (inklusive tidszonsförskjutningen), i början av den aktuella satsen.

Funktionen accepterar inga parametrar, så du kan inte specificera dess precision.

Även statement_timestamp() är en icke-SQL-standardfunktion.

Syntax

Syntaxen ser ut så här:

statement_timestamp()

Inga argument krävs eller accepteras.

Grundläggande exempel

Här är ett grundläggande exempel att visa.

SELECT statement_timestamp();

Resultat:

2020-07-02 09:30:45.46903+10

Inom en transaktion

Här är ett exempel för att visa hur det fungerar inom en transaktion.

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

Här är hela resultatet i min terminal när jag använder psql:

postgres=# BEGIN;
BEGIN
postgres=# SELECT statement_timestamp();
      statement_timestamp      
-------------------------------
 2020-07-02 09:31:13.363128+10
(1 row)


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


postgres=# SELECT statement_timestamp();
      statement_timestamp      
-------------------------------
 2020-07-02 09:31:18.424503+10
(1 row)


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


postgres=# SELECT statement_timestamp();
      statement_timestamp      
-------------------------------
 2020-07-02 09:31:23.501539+10
(1 row)


postgres=# COMMIT;
COMMIT

I det här exemplet använde jag pg_sleep() funktion för att fördröja exekvering mellan varje sats.

Eftersom varje statement_timestamp() anropet fanns i sin egen SQL-sats, den returnerade tidsstämpeln var olika för varje anrop.

Detta är i motsats till transaction_timestamp() , vilket inte gör ändra med varje påstående. Den returnerar sin tidsstämpel baserat på starttiden för transaktionen.

Flera samtal inom ett kontoutdrag

Här är ett exempel på vad som händer om vi kombinerar alla tre funktionsanrop i en enda SQL-sats.

\x
SELECT 
  statement_timestamp(),
  pg_sleep(5),
  statement_timestamp(),
  pg_sleep(5),
  statement_timestamp();

Resultat (med vertikal utdata):

statement_timestamp | 2020-07-02 09:34:41.06911+10
pg_sleep            | 
statement_timestamp | 2020-07-02 09:34:41.06911+10
pg_sleep            | 
statement_timestamp | 2020-07-02 09:34:41.06911+10

Den här gången är alla tre tidsstämpelvärdena identiska, även om pg_sleep() funktion användes för att fördröja exekvering mellan varje anrop till statement_timestamp() .

Detta står i kontrast till clock_timestamp() funktion, som ändras även när den fortskrider genom satsen (om den anropas flera gånger i satsen).


  1. UPSERT till tabell med dynamiskt tabellnamn

  2. Hur kombinerar jag data från två separata tabeller till en enda markör?

  3. Ändra hur isql kör SQL

  4. Hur anropar man en Oracle-funktion med en Ref Cursor som Out-parameter från C#?