sql >> Database teknologi >  >> RDS >> PostgreSQL

How Now() virker i PostgreSQL

I PostgreSQL er now() funktion returnerer den aktuelle dato og det aktuelle klokkeslæt (inklusive tidszoneforskydningen) ved starten af ​​den aktuelle transaktion.

Det svarer til transaction_timestamp() funktion.

Det ligner også current_timestamp funktion (når den kaldes uden et argument).

now() Funktionen accepterer ikke nogen parametre, så du kan ikke angive dens præcision, hvorimod current_timestamp kan kaldes med eller uden en præcisionsparameter.

Også now() er ikke-SQL-standard (som er transaction_timestamp() funktion).

Syntaks

Syntaksen ser sådan ud:

now()

Ingen argumenter er påkrævet eller accepteret.

Grundlæggende eksempel

Her er et grundlæggende eksempel at demonstrere.

SELECT now();

Resultat:

2020-07-02 09:51:12.088506+10

Inden for en transaktion

Her er et eksempel, der viser, hvordan det fungerer inden for en transaktion.

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

Her er det fulde output i min terminal, når jeg bruger 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

Alle tre tidsværdier er identiske, selvom pg_sleep() funktion blev brugt til at forsinke eksekveringen mellem hvert kald til now() , som hver tilfældigvis var i sin egen SQL-sætning.

Så vi kan se, at den returnerede tid for hver erklæring er baseret på starttidspunktet for den aktuelle transaktion – ikke erklæringen. Det ændrer sig ikke, efterhånden som transaktionen skrider frem.

Dette gør det muligt for en enkelt transaktion at have en konsistent forestilling om det "aktuelle" tidspunkt, så flere ændringer inden for samme transaktion bærer det samme tidsstempel.

Flere opkald inden for et kontoudtog

Det ændrer sig heller ikke, efterhånden som udsagnet skrider frem.

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

Resultat (ved hjælp af lodret output):

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

Igen er alle tre tidsværdier identiske, selvom pg_sleep() funktion blev brugt til at forsinke eksekveringen mellem hvert kald til now() .

Dette er i modsætning til statement_timestamp() , hvilket gør ændres med hver sætning, og også clock_timestamp() funktion, som ændres, selv når den skrider frem gennem hver sætning (hvis den kaldes flere gange i sætningen).


  1. Trin for trin opgraderingsproces til R12.2 Upgrade part -3

  2. Hvordan bruger du WITH-klausulen i MySQL?

  3. Postgres kolonne eksisterer ikke

  4. MySQL - Hvordan SUMMER man tider?