Graças à resolução do tipo de função também podemos passar
date
valores para generate_series()
porque há um implícito transmitir a partir de date
para timestamp
bem como a partir de date
para timestamptz
. Seria ambíguo, mas timestamptz
é "preferido" entre "Tipos de data/hora". Explicação detalhada:- Gerando séries temporais entre duas datas no PostgreSQL
Para uma
date
simples a hora local 00:00
é assumido no elenco. Esteja ciente de que a configuração de fuso horário atual afeta diretamente o resultado se você usar date
como entrada já que, obviamente, '2014-01-10 00:00' representa um momento diferente em Tóquio do que em Nova York. Como o Postgres decide quais tipos são aceitáveis?
Postgres basicamente distingue entre três tipos de elencos:
Explicit casts
.. ao usar CAST
ou ::
sintaxe.Assignment cast
.. conversão implícita quando um valor é atribuído a uma coluna de destino.Implicit cast
.. lançamentos implícitos em todas as outras expressões. Tem que haver um implícito cast registrado no sistema do tipo de entrada para o tipo esperado para fazer uma função aceitar (e converter) silenciosamente um valor de entrada.
Para ver quais casts estão definidos para
timestamptz
, você pode consultar a tabela de catálogo 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
Todos esses elencos são implícitos . Por documentação em
castcontext
:
Indica em quais contextos a conversão pode ser invocada.e
significa apenas como uma conversão explícita (usandoCAST
ou::
sintaxe).a
significa atribuição implícita a uma coluna de destino, bem como explicitamente.i
significa implicitamente em expressões, assim como nos demais casos.
Minha ênfase em negrito.