PostgreSQL | Текущее точное время внутри любого места тела функции

PostgreSQL | Текущее точное время внутри любого места тела функции

Иногда нужно получать более точные значения времени в процессе выполнения функции. Стандартное использование функции «now()» даёт не подходящее значение (только потому, что это значение одинаковое внутри тела функции где бы не вызвали).

Для действительно уникальных значений времени (временной метки) нужно использовать функцию «clock_timestamp()«. Она возвращает фактическое текущее время, так что её значение меняется в рамках одной команды SQL.

Примеры

do $$
declare
begin
   raise notice '№1 clock_timestamp() = %', clock_timestamp();
   raise notice '№2 clock_timestamp() = %', clock_timestamp();
   raise notice '№3 clock_timestamp() = %', clock_timestamp();
   raise notice '№4 clock_timestamp() = %', clock_timestamp();
   raise notice '№5 clock_timestamp() = %', clock_timestamp();
end
$$;

Получим уникальные временные метки

№1 clock_timestamp() = 2024-11-15 15:43:02.348073+03
№2 clock_timestamp() = 2024-11-15 15:43:02.348226+03
№3 clock_timestamp() = 2024-11-15 15:43:02.348305+03
№4 clock_timestamp() = 2024-11-15 15:43:02.348387+03
№5 clock_timestamp() = 2024-11-15 15:43:02.348451+03

Скриншот выполнения оператора DO

clock_timestamp - do - 2024
clock_timestamp — do — 2024

Обратите внимание, что команда «raise notice» выводит в консоль строки. Это значит, что временная метка превращается в строку. Мы видим одинаковые значения миллисекунд — 348 миллисекунд. Различия начинаются только на микросекундах!

 

Некорректное отображение временных меток в редакторах-клиентах PostgreSQL

Визуальные редакторы SQL кода могут некорректно отображать тип данных «timestamptz«. Например:

select clock_timestamp()
union
select clock_timestamp()
union
select clock_timestamp()
union
select clock_timestamp()
union
select clock_timestamp()

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

clock_timestamp - некорректное отображение в DBeaver
clock_timestamp — некорректное отображение в DBeaver

Вся проблема в скрытых микросекундах. Простое приведение к строке поможет увидеть разницу.

select clock_timestamp()::text
union
select clock_timestamp()::text
union
select clock_timestamp()::text
union
select clock_timestamp()::text
union
select clock_timestamp()::text

В итоге все три записи будут разными

clock_timestamp - корректное отображение в DBeaver из за приведения к строке
clock_timestamp — корректное отображение в DBeaver из за приведения к строке

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Раздел «Таблица 9.33. Функции даты/времени» — https://postgrespro.ru/docs/postgresql/17/functions-datetime#FUNCTIONS-DATETIME-TABLE

Официальный сайт клиента DBeaver для СУБД PostgreSQLhttps://dbeaver.io