Grazie alla risoluzione del tipo di funzione possiamo anche passare date
valori in generate_series()
perché c'è un implicito trasmesso da date
a timestamp
così come da date
a timestamptz
. Sarebbe ambiguo, ma timestamptz
è "preferito" tra "Tipi di data/ora". Spiegazione dettagliata:
- Generazione di serie temporali tra due date in PostgreSQL
Per una semplice date
l'ora locale 00:00
è assunto nel cast. Tieni presente che l'impostazione del fuso orario corrente influisce direttamente sul risultato se utilizzi date
come input poiché, ovviamente, "2014-01-10 00:00" rappresenta un momento diverso a Tokio rispetto a New York.
In che modo Postgres decide quali tipi sono accettabili?
Postgres distingue fondamentalmente tra tre tipi di calchi:
Explicit casts
.. quando si utilizza CAST
o ::
sintassi.Assignment cast
.. cast implicito quando un valore viene assegnato a una colonna di destinazione.Implicit cast
.. cast impliciti in tutte le altre espressioni.
Ci deve essere un implicito cast registrato nel sistema dal tipo di input al tipo previsto per fare in modo che una funzione accetti (e converta) silenziosamente un valore di input.
Per vedere quali cast sono definiti a timestamptz
, puoi interrogare la tabella del catalogo 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
Tutti questi cast sono impliciti . Per documentazione su castcontext
:
Indica in quali contesti può essere invocato il cast. e
significa solo come cast esplicito (usando CAST
o ::
sintassi). a
significa implicitamente non assegnazione a una colonna di destinazione, oltre che esplicitamente. i
significa implicitamente nelle espressioni, così come negli altri casi.
Enfasi in grassetto la mia.