Давно уже хочу себе зафиксировать эту информацию, но уже почти запомнил. Может кому пригодится.
В 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().
Leave a Reply