PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как сега() работи в PostgreSQL

В PostgreSQL, now() функцията връща текущата дата и час (включително изместването на часовата зона) в началото на текущата транзакция.

Това е еквивалент на transaction_timestamp() функция.

Също така е подобно на current_timestamp функция (когато се извиква без аргумент).

now() функцията не приема никакви параметри, така че не можете да посочите нейната точност, докато current_timestamp може да бъде извикан със или без параметър за точност.

Също така, now() е не-SQL-стандартен (както и transaction_timestamp() функция).

Синтаксис

Синтаксисът е така:

now()

Не се изискват или приемат аргументи.

Основен пример

Ето основен пример за демонстрация.

SELECT now();

Резултат:

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

В рамките на транзакция

Ето пример, за да демонстрирате как работи в рамките на транзакция.

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

Ето пълния изход в моя терминал, когато използвам 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

И трите времеви стойности са идентични, въпреки че pg_sleep() функцията беше използвана за забавяне на изпълнението между всяко извикване на now() , всеки от които се оказа в собствен SQL израз.

Така можем да видим, че времето, върнато за всяко изявление, се основава на началния час на текущата транзакция, а не на изявлението. Не се променя с напредването на транзакцията.

Това позволява на една транзакция да има последователна представа за „текущото“ време, така че множеството модификации в рамките на една и съща транзакция да носят едно и също времеви печат.

Множество обаждания в рамките на изявление

Освен това не се променя с напредването на изявлението.

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

Резултат (с помощта на вертикален изход):

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

Отново и трите времеви стойности са идентични, въпреки че pg_sleep() функцията беше използвана за забавяне на изпълнението между всяко извикване на now() .

Това е в контраст с statement_timestamp() , което прави променяйте с всеки израз, както и clock_timestamp() функция, която се променя, дори когато преминава през всеки израз (ако се извиква няколко пъти в рамките на оператора).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как Postgresql COPY TO STDIN с CSV се актуализира при конфликт?

  2. динамична sql заявка в postgres

  3. Как Tan() работи в PostgreSQL

  4. Как да конвертирате низ в числова стойност в PostgreSQL

  5. Не може просто да се използва името на таблицата PostgreSQL (връзка не съществува)