clock и current time

PostgreSQLДавно уже хочу себе зафиксировать эту информацию, но уже почти запомнил. Может кому пригодится.

В PostgreSQL есть функции для работы с датой и временем. Да-да, кстати, в документации они все описаны. Но их так много, что даже прочитав статью про эти функции — я часть уже неблагополучно забыл.

Хотя бы часть запомнить надо. Исключительно про время. Например, хочу я получить текущее время, для этого можно воспользоваться вот такой функцией:

postgres@demo=# SELECT current_time;
current_time
--------------------
17:03:41.353758+03
(1 row)

Вроде хорошо, но если начать транзакцию — то получим вот такую картину:

postgres@demo=# BEGIN;
WARNING: there is already a transaction in progress
BEGIN

postgres@demo=# SELECT current_time;
current_time
--------------------
17:03:41.353758+03
(1 row)

postgres@demo=# SELECT current_time;
current_time
--------------------
17:03:41.353758+03
(1 row)

postgres@demo=# ROLLBACK;
ROLLBACK

Время не меняется. И даже можно догадаться, почему так 😉

Для получения времени в транзакции можно воспользоваться функцией clock_timestamp():

postgres@demo=# BEGIN;
BEGIN

postgres@demo=# SELECT clock_timestamp();
clock_timestamp
------------------------------
2021-10-30 21:58:10.05244+03
(1 row)

postgres@demo=# SELECT clock_timestamp();
clock_timestamp
------------------------------
2021-10-30 21:58:12.75613+03
(1 row)

postgres@demo=# ROLLBACK;
ROLLBACK

А теперь время (в транзакции!) меняется, так как функция clock_timestamp() выводит фактическое время.

Можно даже сделать вот так:

postgres@demo=# SELECT clock_timestamp(), pg_sleep(3), clock_timestamp();

clock_timestamp | pg_sleep | clock_timestamp
-------------------------------+----------+-------------------------------
2021-10-30 22:00:31.028704+03 | | 2021-10-30 22:00:34.032017+03
(1 row)

В первый вызов этой функции получим время на тот момент, потом идет задержка на 3 секунды, а потом получим уже другое значение функции clock_timestamp().


Be the first to comment

Leave a Reply

Ваш Mail не будет опубликован.


*