postgresql - rango - Generar series de fechas, utilizando el tipo de fecha como entrada
obtener hora de timestamp postgresql (1)
La segunda forma de generate_series()
siempre devuelve timestamptz
y siempre toma timestamptz
como entrada.
timestamp
y la date
se fuerzan automáticamente a timestamptz
. Para una date
00:00
se asume la hora local 00:00
en el proceso.
Tenga en cuenta que la configuración actual de la zona horaria afecta directamente el resultado si utiliza la date
y la timestamp
como entrada, ya que, obviamente, ''2014-01-10 00:00'' representa un punto diferente en el tiempo 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
... cuando se usa CAST
o ::
sintaxis.
Assignment cast
... conversión implícita cuando se asigna un valor a una columna de destino.
Implicit cast
implícito .. moldes implícitos en todas las demás expresiones.
Tiene que haber una conversión implícita registrada en el sistema del tipo de entrada al tipo esperado para hacer que una función acepte (y convierta) en silencio un valor de entrada.
Para ver qué moldes están definidos en 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 moldes son implícitos . Por documentación en castcontext
:
Indica en qué contextos se puede invocar al elenco.
e
significa solo como un elenco explícito (usandoCAST
o::
sintaxis).a
significa implícitamente en la asignación a una columna de destino, así como explícitamente. significa implícitamente en expresiones, así como en los otros casos.
Negrita énfasis mío.
La documentación para generate_series
dice que el argumento puede ser int
o bigint
para generate_series(start, stop)
y generate_series(start, stop, step)
casos y timestamp
o timestamp with time zone
para generate_series(start, stop, step interval)
.
¿Cuál es la razón por la que generate_series
funciona también con date
type como entrada y devuelve timestamp with timezone
?
pg=# select generate_series(''2014-01-01''::date,''2014-01-02''::date,''1 day'');
generate_series
------------------------
2014-01-01 00:00:00+01
2014-01-02 00:00:00+01
(2 rows)