PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak Now() działa w PostgreSQL

W PostgreSQL now() funkcja zwraca bieżącą datę i godzinę (wraz z przesunięciem strefy czasowej), na początku bieżącej transakcji.

Jest to odpowiednik transaction_timestamp() funkcja.

Jest również podobny do current_timestamp funkcja (gdy wywołana bez argumentu).

now() funkcja nie przyjmuje żadnych parametrów, więc nie można określić jej precyzji, natomiast current_timestamp można wywołać z parametrem precyzji lub bez niego.

Również now() nie jest zgodny ze standardem SQL (podobnie jak transaction_timestamp() funkcja).

Składnia

Składnia wygląda tak:

now() 

Żadne argumenty nie są wymagane ani akceptowane.

Przykład podstawowy

Oto podstawowy przykład do zademonstrowania.

SELECT now(); 

Wynik:

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

W ramach transakcji

Oto przykład pokazujący, jak to działa w ramach transakcji.

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

Oto pełne dane wyjściowe w moim terminalu podczas korzystania z psql:

postgres=# BEGIN;BEGINpostgres=# SELECT now(); teraz ------------------------------- 2020-07-02 09:51:53.905091+10(1 wiersz)postgres=# WYBIERZ pg_sleep(5); pg_sleep ---------- (1 wiersz)postgres=# SELECT now(); teraz ------------------------------- 2020-07-02 09:51:53.905091+10(1 wiersz)postgres=# WYBIERZ pg_sleep(5); pg_sleep ---------- (1 wiersz)postgres=# SELECT now(); teraz ------------------------------- 2020-07-02 09:51:53.905091+10(1 wiersz)postgres=# ZATWIERDZ; ZATWIERDZ

Wszystkie trzy wartości czasu są identyczne, mimo że pg_sleep() funkcja została użyta do opóźnienia wykonania między każdym wywołaniem now() , z których każda znajdowała się we własnej instrukcji SQL.

Widzimy więc, że czas zwracany dla każdego wyciągu jest oparty na czasie rozpoczęcia bieżącej transakcji, a nie na wyciągu. Nie zmienia się wraz z postępem transakcji.

Dzięki temu pojedyncza transakcja ma spójne pojęcie „bieżącego” czasu, dzięki czemu wiele modyfikacji w ramach tej samej transakcji ma ten sam znacznik czasu.

Wiele połączeń w wyciągu

Nie zmienia się również w miarę postępów w oświadczeniu.

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

Wynik (przy użyciu wyjścia pionowego):

teraz | 2020-07-02 09:53:33.766806+10pg_sleep | teraz | 2020-07-02 09:53:33.766806+10pg_sleep | teraz | 2020-07-02 09:53:33.766806+10

Ponownie, wszystkie trzy wartości czasu są identyczne, mimo że pg_sleep() funkcja została użyta do opóźnienia wykonania między każdym wywołaniem now() .

Jest to w przeciwieństwie do statement_timestamp() , co robi zmienić z każdą instrukcją, a także clock_timestamp() funkcja, która zmienia się nawet w miarę przechodzenia przez każdą instrukcję (jeśli jest wywoływana wiele razy w obrębie instrukcji).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zdobądź n pogrupowanych kategorii i zsumuj inne w jedną

  2. Uzyskaj liczbę rekordów, których dotyczy INSERT lub UPDATE w PostgreSQL

  3. Parametr konfiguracyjny work_mem w PostgreSQL w systemie Linux

  4. Jak make_timestamp() działa w PostgreSQL

  5. PostgreSQL działa wolno na dużym stole z tablicami i mnóstwem aktualizacji