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

Как Transaction_timestamp() работи в PostgreSQL

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

Това е еквивалент на традиционната функция на Postgres now() .

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

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

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

Синтаксис

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

transaction_timestamp()

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

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

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

SELECT transaction_timestamp();

Резултат:

2020-07-02 08:23:08.810484+10

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

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

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

Ето пълния изход в моя терминал, когато използвам psql:

postgres=# BEGIN;
BEGIN
postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


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


postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


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


postgres=# SELECT transaction_timestamp();
     transaction_timestamp     
-------------------------------
 2020-07-02 08:27:04.229266+10
(1 row)


postgres=# COMMIT;
COMMIT

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

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

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

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

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

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

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

transaction_timestamp | 2020-07-02 09:15:56.154175+10
pg_sleep              | 
transaction_timestamp | 2020-07-02 09:15:56.154175+10
pg_sleep              | 
transaction_timestamp | 2020-07-02 09:15:56.154175+10

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

Това е в контраст с 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. Симулирате CREATE DATABASE, АКО НЕ СЪЩЕСТВУВА за PostgreSQL?

  2. Грешка при настройка на n_distinct с помощта на променлива plpgsql

  3. Как да декодирате PostgreSQL bytea колона шестнадесетичен към int16/uint16 в r?

  4. MySQL срещу PostgreSQL за уеб приложения

  5. Кога се избира за заключване и отключване на актуализиране?