es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    WITH date_series AS (
      SELECT 
        n,
        TRUNC( start_date, 'MM' ) + ( LEVEL - 1 ) AS month
      FROM original_table
      CONNECT BY LEVEL <= MONTHS_BETWEEN( end_date, start_date ) + 1
    )
    INSERT INTO final_table ( n, month )
    SELECT n, month
    FROM date_series
    ORDER BY n, month;
    

    En esta consulta, la tabla original_table es tu tabla inicial con las columnas N, Start y End. El CTE date_series genera una serie de fechas entre las fechas de Start y End para cada fila en la tabla original, redondeadas al mes más cercano utilizando la función TRUNC. La pseudocolumna LEVEL 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 tabla final_table para cada mes en date_series, con el valor N copiado de la tabla original y el valor month extraído de la fecha utilizando la función EXTRACT.

    Nota que debes reemplazar original_table y final_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.

Comments are closed.