Как получить реальное время в транзакции PostgreSQL?

Насколько я понимаю, now() возвращает одно и то же время в течение всей транзакции PostgreSQL? Но как получить реальное время?

Кроме того, меня интересует, есть ли какой-либо параметр конфигурации для ограничения продолжительности транзакции, чтобы после истечения этого периода транзакция немедленно терпела неудачу или как-то еще запрещала следующие запросы?


person seas    schedule 29.07.2010    source источник
comment
Эти два вопроса кажутся мне не связанными.   -  person Mark Byers    schedule 29.07.2010
comment
Я хотел бы ограничить злоупотребление длительностью транзакции, поэтому, в зависимости от гибкости стандартного решения, я бы выбрал его или свое собственное решение, основанное на реальном времени (сбой транзакции в хранимой процедуре). Итак, вопросы относятся к сфере моей задачи.   -  person seas    schedule 29.07.2010
comment
Я не могу найти документацию о длительности/тайм-ауте транзакции с откатом. Вы можете получить что-то из тайм-аутов сеанса (и запустить эту транзакцию в выделенном сеансе), но это все еще не элегантно. Я бы посмотрел, работает ли ваше элегантное индивидуальное решение. :)   -  person Tobiasopdenbrouw    schedule 29.07.2010
comment
См. документацию по текущей дате/времени. Особенно функция clock_timestamp может быть полезна для решения проблемы.   -  person Augustus Kling    schedule 18.08.2011


Ответы (3)


Timeofday()

Может работать на вас.

person Tobiasopdenbrouw    schedule 29.07.2010
comment
Причуда, которую вы должны иметь в виду: timeofday() — это историческая функция PostgreSQL. Как и clock_timestamp(), он возвращает фактическое текущее время, но в виде форматированной текстовой строки, а не временной метки со значением часового пояса. - person Milen A. Radev; 29.07.2010
comment
@Milen Спасибо за ваш комментарий. Это должен быть ответ сам по себе, поэтому я могу проголосовать за него :) - person Mahmoud Abdelkader; 08.04.2011
comment
@MilenA.Radev timeofday() действительно возвращает текст, но clock_timestamp() возвращает метку времени с часовым поясом. - person AndreKR; 09.04.2018

Используйте 1_.

now() — это традиционный эквивалент PostgreSQL для transaction_timestamp(), который эквивалентен CURRENT_TIMESTAMP. Эти функции возвращают время начала текущей транзакции. Их значения не меняются во время транзакции.

statement_timestamp() возвращает время получения последнего командного сообщения от клиента.

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

Дополнительную информацию см. в документации.

person Fernando Correia    schedule 11.06.2014
comment
У меня работает со столбцом TIMESTAMPTZ. - person electrotype; 17.10.2018

Чтобы ограничить время оператора (не транзакции), вы можете использовать оператор_таймаут. now() будет увеличиваться при каждом выполнении if вне блока транзакции. Таким образом:

postgres=# select now();
              now              
-------------------------------
 2010-08-11 13:44:36.207614-07
(1 row)

postgres=# select now();
              now              
-------------------------------
 2010-08-11 13:44:36.688054-07
(1 row)

postgres=# select now();
              now              
-------------------------------
 2010-08-11 13:44:40.407623-07
(1 row)

postgres=# begin;
BEGIN
postgres=# select now();
              now              
-------------------------------
 2010-08-11 13:44:43.417611-07
(1 row)

postgres=# select now();
              now              
-------------------------------
 2010-08-11 13:44:43.417611-07
(1 row)

postgres=# 
person Joshua D. Drake    schedule 11.08.2010