sql >> Base de Datos >  >> RDS >> PostgreSQL

Generate_series en Postgres desde la fecha de inicio y finalización en una tabla

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?