sql >> Databasteknik >  >> RDS >> PostgreSQL

How Now() fungerar i PostgreSQL

I PostgreSQL, now() funktionen returnerar aktuellt datum och tid (inklusive tidszonsförskjutningen), i början av den aktuella transaktionen.

Det är motsvarigheten till transaction_timestamp() funktion.

Det liknar också current_timestamp funktion (när anropad utan argument).

now() Funktionen accepterar inte några parametrar, så du kan inte specificera dess precision, medan current_timestamp kan anropas med eller utan en precisionsparameter.

Även now() är icke-SQL-standard (liksom transaction_timestamp() funktion).

Syntax

Syntaxen ser ut så här:

now()

Inga argument krävs eller accepteras.

Grundläggande exempel

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

SELECT now();

Resultat:

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

Inom en transaktion

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

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

Här är hela resultatet i min terminal när jag använder 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

Alla tre tidsvärdena är identiska, även om pg_sleep() funktion användes för att fördröja exekvering mellan varje anrop till now() , som var och en råkade vara i sin egen SQL-sats.

Så vi kan se att tiden som returneras för varje uttalande baseras på starttiden för den aktuella transaktionen – inte uttalandet. Det ändras inte när transaktionen fortskrider.

Detta tillåter en enskild transaktion att ha en konsekvent uppfattning om den "aktuella" tiden, så att flera ändringar inom samma transaktion har samma tidsstämpel.

Flera samtal inom ett kontoutdrag

Det ändras inte heller när uttalandet fortskrider.

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

Resultat (med vertikal utdata):

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

Återigen, alla tre tidsvärdena är identiska, även om pg_sleep() funktion användes för att fördröja exekvering mellan varje anrop till now() .

Detta är i motsats till statement_timestamp() , vilket gör ändras med varje sats, och även clock_timestamp() funktion, som ändras även när den fortskrider genom varje sats (om den anropas flera gånger i satsen).


  1. välj rownum från lön där rownum=3;

  2. 8 sätt att lägga till dagar till ett datum i MariaDB

  3. Hur man skriver om ÄR SKILJER FRÅN och SKILJER INTE FRÅN?

  4. Oracle hittar en begränsning