No necesita un CTE para esto, eso sería más costoso de lo necesario.
Y no necesita transmitir a timestamp
, el resultado ya es del tipo de datos timestamp
cuando alimentas timestamp
tipos a generate_series()
. Detalles aquí:
- Generando series de tiempo entre dos fechas en PostgreSQL
En Postgres 9.3 o posterior puedes usar un LATERAL
unirse:
SELECT to_char(ts, 'YYYY-MM-DD HH24') AS formatted_ts
FROM (
SELECT min(start_timestamp) as first_date
, max(start_timestamp) as last_date
FROM header_table
) h
, generate_series(h.first_date, h.last_date, interval '1 hour') g(ts);
Opcionalmente con to_char()
para obtener el resultado como texto en el formato que mencionaste.
Esto funciona en cualquier Versión de PostgreSQL:
SELECT generate_series(min(start_timestamp)
, max(start_timestamp)
, interval '1 hour') AS ts
FROM header_table;
Por lo general, un poco más rápido.
Llamar funciones de devolución de conjuntos en SELECT
list es una función SQL no estándar y algunos la desaprueban. Además, hubo anomalías de comportamiento (aunque no para este caso simple) que finalmente se solucionaron en Postgres 10. Ver:
- ¿Cuál es el comportamiento esperado para varias funciones de devolución de conjuntos en la cláusula SELECT?
Nota una sutil diferencia en NULL manejo:
El equivalente de
max(start_timestamp)
se obtiene con
ORDER BY start_timestamp DESC NULLS LAST
LIMIT 1
Sin NULLS LAST
Los valores NULL vienen primero en orden descendente (si hay puede ser valores NULL en start_timestamp
). Obtendría NULL para last_date
y su consulta saldría vacía.
Detalles:
- ¿Por qué los valores NULL aparecen primero cuando se solicita DESC en una consulta de PostgreSQL?