sql >> Database >  >> RDS >> PostgreSQL

Hoe Now() werkt in PostgreSQL

In PostgreSQL is de now() functie retourneert de huidige datum en tijd (inclusief de tijdzone-offset), aan het begin van de huidige transactie.

Het is het equivalent van de transaction_timestamp() functie.

Het is ook vergelijkbaar met de current_timestamp functie (indien aangeroepen zonder argument).

De now() functie accepteert geen parameters, dus u kunt de precisie ervan niet specificeren, terwijl current_timestamp kan worden aangeroepen met of zonder een precisieparameter.

Ook now() is niet-SQL-standaard (zoals de transaction_timestamp() functie).

Syntaxis

De syntaxis gaat als volgt:

now()

Er zijn geen argumenten vereist of geaccepteerd.

Basisvoorbeeld

Hier is een eenvoudig voorbeeld om te demonstreren.

SELECT now();

Resultaat:

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

Binnen een transactie

Hier is een voorbeeld om te laten zien hoe het werkt binnen een transactie.

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

Hier is de volledige uitvoer in mijn terminal bij gebruik van 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 drie de tijdwaarden zijn identiek, hoewel de pg_sleep() functie werd gebruikt om de uitvoering te vertragen tussen elke aanroep naar now() , die elk toevallig in hun eigen SQL-instructie stonden.

We kunnen dus zien dat de tijd die voor elk afschrift wordt geretourneerd, is gebaseerd op de starttijd van de huidige transactie - niet op het afschrift. Het verandert niet naarmate de transactie vordert.

Hierdoor kan een enkele transactie een consistent idee hebben van de "huidige" tijd, zodat meerdere wijzigingen binnen dezelfde transactie hetzelfde tijdstempel dragen.

Meerdere oproepen binnen een verklaring

Het verandert ook niet naarmate de verklaring vordert.

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

Resultaat (met verticale uitvoer):

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

Nogmaals, alle drie de tijdwaarden zijn identiek, hoewel de pg_sleep() functie werd gebruikt om de uitvoering te vertragen tussen elke aanroep naar now() .

Dit in tegenstelling tot statement_timestamp() , wat doet veranderen met elke instructie, en ook de clock_timestamp() functie, die verandert zelfs als het door elke instructie gaat (indien meerdere keren aangeroepen binnen de instructie).


  1. Selecteer xml-elementwaarde in Oracle

  2. MySQL-prestaties:introductie tot JOIN's in SQL

  3. Hoe TABLE af te kappen in Oracle

  4. Hoe verander ik SQL Server 2005 in hoofdlettergevoelig?