Иногда нужно получать более точные значения времени в процессе выполнения функции. Стандартное использование функции «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
Обратите внимание, что команда «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()
Данная команда может вернуть разное количество записей в результирующей таблице, хотя визуально в редакторе значения выглядят одинаково:
Вся проблема в скрытых микросекундах. Простое приведение к строке поможет увидеть разницу.
select clock_timestamp()::text union select clock_timestamp()::text union select clock_timestamp()::text union select clock_timestamp()::text union select clock_timestamp()::text
В итоге все три записи будут разными
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Раздел «Таблица 9.33. Функции даты/времени» — https://postgrespro.ru/docs/postgresql/17/functions-datetime#FUNCTIONS-DATETIME-TABLE
Официальный сайт клиента DBeaver для СУБД PostgreSQL — https://dbeaver.io