Il n'y a pas de différence. Trois citations du manuel:
1)
Ces fonctions standard SQL renvoient toutes des valeurs en fonction de l'heure de début de la transaction en cours:
...
...
CURRENT_TIMESTAMP
2)
transaction_timestamp()
est équivalent à CURRENT_TIMESTAMP
, mais est nommé pour refléter clairement ce qu'il retourne.
3)
now()
est un équivalent PostgreSQL traditionnel à transaction_timestamp()
.
Gras accent mien. CURRENT_TIMESTAMP
, transaction_timestamp()
Et now()
faire exactement la même chose. CURRENT_TIMESTAMP
est une bizarrerie syntaxique pour une fonction, sans paire de parenthèses. C'est selon le standard SQL.
Si vous ne déclarez pas d'alias de colonne pour un appel de fonction dans une instruction SQL, l'alias utilise par défaut le nom de la fonction. En interne, le SQL standard CURRENT_TIMESTAMP
est implémenté avec now()
. Jusqu'à Postgres 9.6, le nom de la colonne résultante était "now", mais "current_timestamp" dans Postgres 10.
transaction_timestamp()
fait de même, mais celle-ci est une fonction Postgres appropriée, de sorte que l'alias par défaut a toujours été "transaction_timestamp".
Ne pas confondre l' une de ces fonctions avec la spéciale constante d'entrée'now'
. Ce n'est qu'un des raccourcis de notation pour des valeurs de date / heure / horodatage spécifiques, citant le manuel:
... qui seront convertis en valeurs date / heure ordinaires lors de la lecture. (En particulier, now
les chaînes associées sont converties en une valeur temporelle spécifique dès leur lecture.) Toutes ces valeurs doivent être placées entre guillemets simples lorsqu'elles sont utilisées comme constantes dans des commandes SQL.
Cela peut ajouter à la confusion que (jusqu'à au moins Postgres 12) un nombre quelconque d'espaces de début et de fin et des crochets ( {[( )]}
) sont coupés de ces valeurs d'entrée spéciales. Donc 'now()'::timestamptz
- ou juste 'now()'
là où aucun transtypage de type explicite n'est requis - est également valide et a pour résultat d'évaluer le même horodatage que la fonction now()
dans la plupart des contextes . Mais ce sont des constantes et généralement pas ce que vous voulez comme colonne par défaut par exemple.
db <> fiddle here
Vieux violon SQL
Des alternatives notables sont statement_timestamp()
et clock_timestamp()
. Le manuel:
statement_timestamp()
renvoie l'heure de début de l'instruction en cours (plus précisément l'heure de réception du dernier message de commande du client). [...]
clock_timestamp()
renvoie l'heure actuelle et, par conséquent, sa valeur change même au sein d'une seule commande SQL.
Note: statement_timestamp()
est STABLE
comme ci - dessus (retourne toujours la même valeur dans la même commande SQL). Mais clock_timestamp()
est nécessairement seulement VOLATILE
. La différence peut être significative.
where items.createddate > now()
:?now()
est définiSTABLE
car il a la même valeur (l'heure de début de la transaction en cours) dans la même transaction. Dans votre exemple,now()
n’est exécuté qu’une fois (par opposition àclock_timestamp()
par exemple).De plus, ils n’ont aucune différence fonctionnelle lorsque vous les utilisez correctement, ils sont exprimés différemment:
'now()'
reconnu (comme'today'
ou'now'
):'CURRENT_TIMESTAMP'
donne une erreur amusante des bords sombreset
'transaction_timestamp()'
n'est tout simplement pas reconnu comme horodatage avec la valeur tz:S'il vous plaît ne demandez pas pourquoi voudriez-vous lancer
'now()' as timestamp
. J'ai vu à lawhere timestamp_column = 'now()'
place duwhere timestamp_column = now()
code de personnes, alors je pensais que cette clarification serait un fait amusant et un bon ajout à la réponse d'Erwin.la source
'now()'
ressemble à la fonctionnow()
sur la surface, mais n'est pas directement liée autrement.'now'
est une évaluation constante de l' heure de début de la transaction en cours . Les parens de fin sont ignorés. La tentative de lancer les cordes'CURRENT_TIMESTAMP'
ou'transaction_timestamp()'
detimestamp
manière similaire échoue, parce que c'est absurde. Ni est liée aux fonctions correspondantes.