Нет никакой разницы. Три цитаты из руководства:
1)
Все эти стандартные функции SQL возвращают значения, основанные на времени начала текущей транзакции:
...
...
CURRENT_TIMESTAMP
2)
transaction_timestamp()эквивалентно CURRENT_TIMESTAMP, но назван так, чтобы четко отражать то, что он возвращает.
3)
now()является традиционным PostgreSQL эквивалентом transaction_timestamp().
Жирный акцент мой. CURRENT_TIMESTAMP, transaction_timestamp()И now()делать точно то же самое. CURRENT_TIMESTAMPявляется синтаксической странностью для функции, не имеющей завершающей пары скобок. Это в соответствии со стандартом SQL.
Если вы не объявляете псевдоним столбца для вызова функции в операторе SQL, псевдонимом по умолчанию является имя функции. Внутренне стандарт SQL CURRENT_TIMESTAMPреализован с помощью now(). Вплоть до Postgres 9.6, который отображается в имени получающегося столбца , которое было «сейчас», но в Postgres 10 было изменено на «current_timestamp».
transaction_timestamp() делает то же самое, но эта функция является надлежащей функцией Postgres, поэтому псевдоним по умолчанию всегда был «action_timestamp ».
Вы не путайте либо из этих функций со специальной константой ввода'now' . Это всего лишь один из нескольких обозначений для конкретных значений даты / времени / метки времени, цитируя руководство:
... которые будут преобразованы в обычные значения даты / времени при чтении. (В частности, nowи связанные строки преобразуются в определенное значение времени, как только они прочитаны.) Все эти значения должны быть заключены в одинарные кавычки при использовании в качестве констант в командах SQL.
Это может добавить к путанице, что (по крайней мере до Postgres 12) любое количество начальных и конечных пробелов и скобок ( {[( )]}) обрезается от этих специальных входных значений. Таким образом 'now()'::timestamptz- или просто 'now()'там, где явное приведение типов не требуется - также допустимо и now() в большинстве случаев вычисляется с той же временной меткой, что и функция . Но это константы и, как правило, не те, которые вы хотите, например, по умолчанию для столбцов.
db <> скрипка здесь
Старая скрипка SQL
Известные альтернативы statement_timestamp()и clock_timestamp(). Руководство:
statement_timestamp()возвращает время начала текущего оператора (точнее, время получения последнего командного сообщения от клиента). [...]
clock_timestamp()возвращает фактическое текущее время, и, следовательно, его значение изменяется даже в пределах одной команды SQL.
Примечание: statement_timestamp()это , STABLEкак указано выше (всегда возвращает то же значение в пределах одной и той же команды SQL). Но clock_timestamp()обязательно есть только VOLATILE. Разница может быть значительной.
where items.createddate > now():?