web-dev-qa-db-fra.com

Différence entre now () et current_timestamp

Dans PostgreSQL, j'utilise la now() et current_timestamp fonction et je ne vois aucune différence:

# SELECT now(), current_timestamp;
              now               |              now               
--------------------------------+--------------------------------
 04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)

Suis-je en train de manquer quelque chose?

51
JohnMerlino

Il n'y a pas de différence. Trois citations du manuel:

1)

Ces fonctions standard SQL renvoient toutes des valeurs basées sur 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 renvoie.

3)

now() est un équivalent PostgreSQL traditionnel de transaction_timestamp().

Gras accentuation mienne. CURRENT_TIMESTAMP, transaction_timestamp() et now() font exactement la même chose. CURRENT_TIMESTAMP Est une bizarrerie syntaxique pour une fonction, sans paire de parenthèses de fin. C'est selon la norme SQL.

Si vous ne déclarez pas d'alias de colonne pour un appel de fonction dans une instruction SQL, l'alias par défaut est le nom de la fonction. En interne, le standard-SQL CURRENT_TIMESTAMP Est implémenté avec now(). Jusqu'à Postgres 9.6 qui apparaît dans le nom de colonne résultant , qui était "maintenant", mais changé en "current_timestamp" dans Postgres 10.

transaction_timestamp() fait de même, mais celle-ci est une fonction Postgres appropriée, donc l'alias par défaut a toujours été "transaction_timestamp".

Ne pas confondez l'une de ces fonctions avec la spéciale constante d'entrée 'now' . Ce n'est là qu'un des nombreux raccourcis de notation pour des valeurs de date/heure/horodatage spécifiques, en citant le manuel:

... qui sera converti en valeurs de date/heure ordinaires lors de la lecture. (En particulier, now et les chaînes associées sont converties en une valeur de temps spécifique dès qu'elles sont lues.) Toutes ces valeurs doivent être placées entre guillemets simples lorsqu'elles sont utilisées comme constantes dans les commandes SQL.

Cela peut ajouter à la confusion que (jusqu'à au moins Postgres 12) un nombre quelconque d'espaces et de crochets de début et de fin ({[( )]}) sont supprimés de ces valeurs d'entrée spéciales. Donc 'now()'::timestamptz - ou simplement 'now()' où aucun transtypage de type explicite n'est requis - est également valide et arrive à é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 <> violon ici
Ancien violon SQL

Les 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 réelle, et donc sa valeur change même au sein d'une seule commande SQL.

Remarque: statement_timestamp() est STABLE comme ci-dessus (renvoie toujours la même valeur dans la même commande SQL). Mais clock_timestamp() n'est nécessairement que VOLATILE. La différence peut être importante.

63
Erwin Brandstetter

De plus, ils n'ont aucune différence fonctionnelle lorsque vous les utilisez correctement, ils sont castés différemment:

'now()' reconnue (comme 'today' ou 'now'):

b=# select 'now()'::timestamptz;
          timestamptz
-------------------------------
 2016-12-09 16:31:35.942243+00
(1 row)

'CURRENT_TIMESTAMP' Donne drôle d'erreur des bords sombres

Remarque: à partir de PostgreSQL version 7.2, "actuel" n'est plus pris en charge en tant que constante de date/heure

b=# select 'CURRENT_TIMESTAMP'::timestamptz;
ERROR:  date/time value "current" is no longer supported
LINE 1: select 'CURRENT_TIMESTAMP'::timestamptz;
               ^

et 'transaction_timestamp()' n'est tout simplement pas recongonisé comme horodatage avec une valeur tz:

b=# select 'transaction_timestamp()'::timestamptz;
ERROR:  invalid input syntax for type timestamp with time zone: "transaction_timestamp()"
LINE 1: select 'transaction_timestamp()'::timestamptz;
               ^

Veuillez ne pas demander pourquoi voudriez-vous cast 'now()' as timestamp. J'ai vu where timestamp_column = 'now()' au lieu de where timestamp_column = now() dans le code des personnes, alors j'ai pensé que cette clarification serait un fait amusant et un bon ajout à la réponse d'Erwin.

3
Vao Tsun