Pregunta

Estoy construyendo una tabla de resumen como parte de un procedimiento almacenado y tengo dos columnas.La primera columna debe mostrar el inicio y la segunda columna debe mostrar el final de un rango de fechas que se basa en un parámetro de entrada que es un número que designa el trimestre.Pude sacar lo siguiente de Asktom, pero tengo algunas preguntas.

Open C1 FOR
SELECT  ( SELECT TRUNC (SYSDATE, 'Q')-1+1 AS 'StartOf' FROM DUAL ),
SELECT  ( SELECT TRUNC(ADD_MONTHS (SYSDATE, +3), 'Q')-2 AS 'EndOf' FROM DUAL )
FROM DUAL; 

Pregunta 1. ¿Harán las matemáticas a aquí para los lealejes ... no creo que lo hará, pero no estoy seguro de cómo manejar eso?

Pregunta 2. ¿Cómo agrego el parámetro de entrada, 'INCESTER' como el trimestre específico?He intentado ponerlo en lugar de Sysdate, ¡pero necesito reformatearlo en la fecha primero, creo?

Gracias de antemano por cualquier respuesta.

¿Fue útil?

Solución

Tom Kyte le ha dado la respuesta: http:// Asktom.orace.com / pls / asktom / f? p= 100: 11: 0 :::: P11_Question_ID: 250288900346075009

Open C1 FOR 
select add_months( dt, (inQuarter-1)*3 ),
       last_day(add_months( dt, (inQuarter-1)*3+2 ) )
from (
  select to_date( inYear || '0101', 'yyyymmdd' ) dt
  from dual)

Otros consejos

Puede convertir un año numérico y un parámetro numérico de trimestre a un DATE

SELECT add_months( trunc( to_date( to_char( <<numeric year>> ),
                                   'YYYY' ),
                          'YYYY' ),
                   3 * <<numeric quarter>> ) first_of_quarter,
       add_months( trunc( to_date( to_char( <<numeric year>> ),
                                   'YYYY' ),
                          'YYYY' ),
                   4 * <<numeric quarter>> ) - 1 last_of_quarter,
  FROM dual

El componente de tiempo de ambas fechas será de medianoche el último día del trimestre (es decir, 24 horas antes del comienzo del próximo trimestre).Es posible que desee que el último del trimestre sea las 23:59:59 en el último día del trimestre si desea que el rango pueda incluir todas las fechas posibles en el trimestre.

Sugerir:

Open C1 FOR
SELECT TRUNC (d_inQuarter, 'Q') AS "StartOf",
       TRUNC(ADD_MONTHS (d_inQuarter, +3), 'Q') AS "EndOf"
FROM (SELECT add_months(to_date(to_char(i_yr)||'-01-01','YYYY-MM-DD'), (i_q-1)*3)
      AS d_inQuarter FROM DUAL); 

- con parámetros enteros i_yr y i_q que representan el año y el cuarto, respectivamente.

Tenga en cuenta que el endof representará la medianoche el primer día del próximo trimestre, por lo que cualquier selección debe basarse en las condiciones generales < "EndOf", no <= "EndOf".(Esto debería asegurarse de que se incluyan todas las horas en el último día del trimestre).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top