Inserte una fila para cada mes en el rango.
Quiero crear mi tabla aquí en Oracle
+----+------------+------------+
| N | Inicio | Fin |
+----+------------+------------+
| 1 | 2018-01-01 | 2018-05-31 |
| 1 | 2018-01-01 | 2018-06-31 |
+----+------------+------------+
En, por más ridículo que parezca, necesito insertar una fila por cada mes en el rango para cada uno en la primera tabla
+----+------------+
| N | mes | |
+----+------------+
| 1 | 2018-01-01 |
| 1 | 2018-01-01 |
| 1 | 2018-02-01 |
| 1 | 2018-02-01 |
| 1 | 2018-03-01 |
| 1 | 2018-03-01 |
| 1 | 2018-04-01 |
| 1 | 2018-04-01 |
| 1 | 2018-05-01 |
| 1 | 2018-05-01 |
| 1 | 2018-06-01 |
+----+------------+
He estado intentando seguir https://stackoverflow.com/questions/51058429/sql-generate-record-per-month-in-date-range pero no he tenido suerte al obtener el resultado que quiero.
Gracias por tu ayuda.
davy.ai
Para lograr el resultado deseado, puedes utilizar una expresión de tabla común (CTE) y generar una serie de fechas entre la fecha de inicio y la fecha de fin para cada fila en la tabla original. Luego, puedes utilizar la función
EXTRACT
para extraer el mes de cada fecha e insertar una nueva fila en la tabla final para cada mes.Aquí tienes un ejemplo de consulta para lograr esto:
En esta consulta, la tabla
original_table
es tu tabla inicial con las columnasN
,Start
yEnd
. El CTEdate_series
genera una serie de fechas entre las fechas deStart
yEnd
para cada fila en la tabla original, redondeadas al mes más cercano utilizando la funciónTRUNC
. La pseudocolumnaLEVEL
se utiliza para generar una fila para cada mes entre las fechas de inicio y fin.Finalmente, la sentencia
INSERT INTO
inserta una nueva fila en la tablafinal_table
para cada mes endate_series
, con el valorN
copiado de la tabla original y el valormonth
extraído de la fecha utilizando la funciónEXTRACT
.Nota que debes reemplazar
original_table
yfinal_table
con los nombres reales de tus tablas en la consulta, y ajustar cualquier nombre de columna o tipo de dato según sea necesario.