now
и transaction_timestamp
эквивалентны стандарту SQL current_timestamp
.Все сообщают время начала транзакции.
С точки зрения транзакций, есть две временные метки, о которых стоит подумать.начало транзакции и время выполнения каждого отдельного оператора. Концептуально существует также время окончания транзакции, которое можно получить, выполнив select statement_timestamp() trx_end_timestamp
в самом конце, непосредственно перед фиксацией / откатом.
Если вы запустите следующеев psql [скопировать всю строку и вставить в psql shell]
BEGIN; SELECT PG_SLEEP(5); SELECT NOW(), CURRENT_TIMESTAMP, TRANSACTION_TIMESTAMP(), STATEMENT_TIMESTAMP(); COMMIT;
Я получил такой вывод:
now | current_timestamp | transaction_timestamp | statement_timestamp
-------------------------------+-------------------------------+-------------------------------+-------------------------------
2019-04-23 11:15:18.676855-04 | 2019-04-23 11:15:18.676855-04 | 2019-04-23 11:15:18.676855-04 | 2019-04-23 11:15:23.713275-04
(1 row)
Вы можете ясно видеть, что NOW
, CURRENT_TIMESTAMP
, TRANSACTION_TIMESTAMP
эквивалентны, а STATEMENT_TIMESTAMP
имеет 5-секундное смещение, потому что мы спали в течение 5 секунд.
Кстати, CURRENT_TIMESTAMP
в стандарте sql.Другие специфичны для postgresql, , хотя другие базы данных также могут реализовывать их