PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Générer une série de dates - en utilisant le type de date comme entrée

Grâce à la résolution de type de fonction on peut aussi passer date valeurs à generate_series() car il y a un implicite diffuser à partir de date à timestamp ainsi qu'à partir de date à timestamptz . Serait ambigu, mais timestamptz est "préféré" parmi "Types de date/heure". Explication détaillée :

  • Génération de séries chronologiques entre deux dates dans PostgreSQL

Pour une date nue l'heure locale 00:00 est assumé dans le casting. Sachez que le paramètre de fuseau horaire actuel affecte directement le résultat si vous utilisez date comme entrée puisque, évidemment, '2014-01-10 00:00' représente un moment différent à Tokio qu'à New York.

Comment Postgres décide-t-il quels types sont acceptables ?

Postgres fait essentiellement la distinction entre trois types de distribution :

Explicit casts .. lors de l'utilisation de CAST ou :: syntaxe.
Assignment cast .. cast implicite lorsqu'une valeur est assignée à une colonne cible.
Implicit cast .. casts implicites dans toutes les autres expressions.

Il doit y avoir un implicite cast enregistré dans le système du type d'entrée au type attendu pour qu'une fonction accepte (et convertisse) silencieusement une valeur d'entrée.

Pour voir quelles distributions sont définies pour timestamptz , vous pouvez interroger la table de catalogue pg_cast :

SELECT castsource::regtype, casttarget::regtype, castcontext
FROM   pg_cast
WHERE  casttarget = 'timestamptz'::regtype;

         castsource          |        casttarget        | castcontext
-----------------------------+--------------------------+-------------
 abstime                     | timestamp with time zone | i
 date                        | timestamp with time zone | i
 timestamp without time zone | timestamp with time zone | i
 timestamp with time zone    | timestamp with time zone | i

Tous ces casts sont implicites . Par documentation sur castcontext :

Indique dans quels contextes le cast peut être invoqué. e signifie uniquement en tant que distribution explicite (en utilisant CAST ou :: syntaxe). a signifie implicitement une inaffectation à une colonne cible, ainsi qu'explicitement. i signifie implicitement dans les expressions, ainsi que les autres cas.

J'insiste sur moi.