Нет никакой разницы. Три цитаты из руководства:
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()
:?now()
Определяется,STABLE
потому что он оценивает одно и то же значение (время начала текущей транзакции) в рамках той же транзакции. В вашем примереnow()
выполняется только один раз (в отличие от,clock_timestamp()
например).Кроме того, что при правильном использовании они не имеют функциональных различий, они приводятся по-разному:
'now()'
узнал (так же, как'today'
или'now'
):'CURRENT_TIMESTAMP'
дает забавную ошибку от темных краеви
'transaction_timestamp()'
просто не указывается как отметка времени со значением tz:Пожалуйста, не спрашивайте, почему вы бросили
'now()' as timestamp
. Я виделwhere timestamp_column = 'now()'
неwhere timestamp_column = now()
в людях код, поэтому думал, что это разъяснение будет забавным фактом и хорошим дополнением к ответу Эрвина.источник
'now()'
выглядит аналогично функцииnow()
на поверхности, но не имеет прямого отношения иначе.'now'
является константой, оценивающей время начала текущей транзакции . Замыкающие скобки игнорируются. Попытка бросить строки'CURRENT_TIMESTAMP'
или'transaction_timestamp()'
кtimestamp
подобным же образом выходит из строя, потому что это просто бред. Ни то, ни другое не связано с соответствующими функциями.