В 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()
функция, която се променя, дори когато преминава през всеки израз (ако се извиква няколко пъти в рамките на оператора).