sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur current_timestamp() fungerar i PostgreSQL

I PostgreSQL, current_timestamp() funktionen returnerar aktuellt datum och tid, inklusive tidszonsförskjutningen.

Tidsstämpeln som returneras är baserad på starttiden för den aktuella transaktionen.

Syntax

Du kan använda den på något av följande sätt:

current_timestamp
current_timestamp(x)

Där x är en valfri precisionsparameter som gör att resultatet avrundas till x antal bråksiffror i sekundfältet.

Utan en precisionsparameter (den första syntaxen) ges resultatet till full tillgänglig precision.

Exempel – Full precision

Här är ett grundläggande exempel för att demonstrera ett resultat med den fulla tillgängliga precisionen.

SELECT current_timestamp;

Resultat:

2020-07-01 15:42:35.630594+10

Exempel – Specifik precision

Här är ett exempel för att visa hur man anger precisionen.

SELECT current_timestamp(0);

Resultat:

2020-07-01 15:42:58+10

I det här exemplet angav jag en precision på noll, vilket betyder att inga bråkdelar returnerades.

Här är ett annat exempel där jag anger ett antal bråkdelar.

SELECT current_timestamp(3);

Resultat:

2020-07-01 15:43:16.644+10

Transaktioner

Den faktiska tidsstämpeln baseras på starttiden för den aktuella transaktionen. Därför ändras det 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.

Här är ett exempel som visar detta.

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

Här är hela utdata från min terminal när jag kör den transaktionen i psql:

postgres=# BEGIN;
BEGIN
postgres=# SELECT current_timestamp;
       current_timestamp       
-------------------------------
 2020-07-02 09:02:52.952669+10
(1 row)


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


postgres=# SELECT current_timestamp;
       current_timestamp       
-------------------------------
 2020-07-02 09:02:52.952669+10
(1 row)


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


postgres=# SELECT current_timestamp;
       current_timestamp       
-------------------------------
 2020-07-02 09:02:52.952669+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 sats i transaktionen.

Detta är i motsats till statement_timestamp() vilket gör ändra med varje påstående.

Flera samtal inom ett kontoutdrag

Det ändras inte heller när uttalandet fortskrider.

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

Resultat (med vertikal utdata):

current_timestamp | 2020-07-02 09:04:03.413062+10
pg_sleep          | 
current_timestamp | 2020-07-02 09:04:03.413062+10
pg_sleep          | 
current_timestamp | 2020-07-02 09:04:03.413062+10

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

Detta är i motsats till clock_timestamp() funktion, som gör ändras allt eftersom det fortskrider genom uttalandet.

Förresten, jag använde vertikal utmatning (även känd som utökad utmatning) för att göra resultaten något mer kompakt.

Du kan växla utökad utdata i psql med \x .


  1. Är innerfog detsamma som equi-join?

  2. Skillnaden mellan sys.objects, sys.system_objects och sys.all_objects i SQL Server

  3. Ett förberett uttalande, `WHERE .. IN(..)`-fråga och sortering - med MySQL

  4. Hur deklarerar man en variabel i MySQL?