Gracias a la resolución de tipo de función también podemos pasar date
valores a generate_series()
porque hay un implícito emitido desde date
a timestamp
así como desde date
a timestamptz
. Sería ambiguo, pero timestamptz
es "preferido" entre "Tipos de fecha/hora". Explicación detallada:
- Generación de series temporales entre dos fechas en PostgreSQL
Para una simple date
la hora local 00:00
se asume en el reparto. Tenga en cuenta que la configuración de la zona horaria actual afecta directamente el resultado si usa date
como entrada ya que, obviamente, '2014-01-10 00:00' representa un momento diferente en Tokio que en Nueva York.
¿Cómo decide Postgres qué tipos son aceptables?
Postgres básicamente distingue entre tres tipos de moldes:
Explicit casts
.. al usar CAST
o ::
sintaxis.Assignment cast
.. conversión implícita cuando se asigna un valor a una columna de destino.Implicit cast
.. conversiones implícitas en todas las demás expresiones.
Tiene que haber un implícito conversión registrada en el sistema del tipo de entrada al tipo esperado para hacer que una función acepte (y convierta) silenciosamente un valor de entrada.
Para ver qué moldes están definidos a timestamptz
, puede consultar la tabla 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 estos lanzamientos son implícitos . Por documentación en castcontext
:
Indica en qué contextos se puede invocar el cast. e
significa solo como un lanzamiento explícito (usando CAST
o ::
sintaxis). a
significa desasignación implícita a una columna de destino, así como explícitamente. i
significa implícitamente en expresiones, así como los demás casos.
Énfasis en negrita mío.