No hay diferencia. Tres citas del manual:
1)
Estas funciones estándar de SQL todos los valores de retorno se basan en la hora de inicio de la transacción actual:
...
...
CURRENT_TIMESTAMP
2)
transaction_timestamp()
es equivalente a CURRENT_TIMESTAMP
, pero se nombra para reflejar claramente lo que devuelve.
3)
now()
es un tradicional PostgreSQL equivalente a transaction_timestamp()
.
El énfasis en negrita es mío. CURRENT_TIMESTAMP
, transaction_timestamp()
y now()
hacer exactamente lo mismo. CURRENT_TIMESTAMP
es una rareza sintáctica para una función, que no tiene par de paréntesis finales. Eso está de acuerdo con el estándar SQL.
Si no declara un alias de columna para una llamada a una función en una instrucción SQL, el alias predeterminado es el nombre de la función. Internamente, el SQL estándar CURRENT_TIMESTAMP
se implementa con now()
. Hasta Postgres 9.6 que se muestra en el nombre de la columna resultante , que era "ahora", pero cambió a "current_timestamp" en Postgres 10.
transaction_timestamp()
hace lo mismo, pero esta es una función adecuada de Postgres, por lo que el alias predeterminado siempre ha sido "transaction_timestamp".
No , no confundir a cualquiera de estas funciones con el especial constante de entrada'now'
. Esa es solo una de las varias abreviaturas de notación para valores específicos de fecha / hora / marca de tiempo, citando el manual:
... que se convertirá en valores normales de fecha / hora cuando se lea. (En particular, now
y las cadenas relacionadas se convierten a un valor de tiempo específico tan pronto como se leen). Todos estos valores deben estar entre comillas simples cuando se usan como constantes en los comandos SQL.
Puede aumentar la confusión de que (hasta al menos Postgres 12) cualquier número de espacios iniciales y finales y corchetes ( {[( )]}
) se recortan de esos valores de entrada especiales. Entonces 'now()'::timestamptz
, o simplemente 'now()'
donde no se requiere conversión de tipo explícito, también es válido y se evalúa con la misma marca de tiempo que la función now()
en la mayoría de los contextos . Pero esas son constantes y, por lo general, no son lo que desea como columna predeterminada, por ejemplo.
db <> violín aquí
Viejo violín de SQL
Las alternativas notables son statement_timestamp()
y clock_timestamp()
. El manual:
statement_timestamp()
devuelve la hora de inicio de la declaración actual (más específicamente, la hora de recepción del último mensaje de comando del cliente). [...]
clock_timestamp()
devuelve la hora actual real y, por lo tanto, su valor cambia incluso dentro de un solo comando SQL.
Nota: statement_timestamp()
es STABLE
como el anterior (siempre devuelve el mismo valor dentro del mismo comando SQL). Pero clock_timestamp()
necesariamente es solo VOLATILE
. La diferencia puede ser significativa.
where items.createddate > now()
:?