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()
:?now()
se defineSTABLE
porque se evalúa al mismo valor (la hora de inicio de la transacción actual) dentro de la misma transacción. I su ejemplo,now()
se ejecuta una sola vez (a diferencia declock_timestamp()
por ejemplo).Además de que no tienen una diferencia funcional cuando los usa correctamente, se lanzan de manera diferente:
'now()'
Reconocido (como'today'
o'now'
):'CURRENT_TIMESTAMP'
da error gracioso de bordes oscurosy
'transaction_timestamp()'
simplemente no se reconoce como marca de tiempo con el valor tz:Por favor, no preguntes por qué lanzarías
'now()' as timestamp
. Lo he visto enwhere timestamp_column = 'now()'
lugar dewhere timestamp_column = now()
en el código de personas, por lo que pensé que esta aclaración sería un hecho curioso y una buena adición a la respuesta de Erwin.fuente
'now()'
parece a la funciónnow()
en la superficie, pero de lo contrario no está directamente relacionada.'now'
es una evaluación constante del tiempo de inicio de la transacción actual . Los parens finales se ignoran. El intento de lanzar las cuerdas'CURRENT_TIMESTAMP'
o'transaction_timestamp()'
detimestamp
manera similar falla, porque eso no tiene sentido. Ninguno de los dos está relacionado con las funciones correspondientes.