Domanda

Sto costruendo una tabella di riepilogo come parte di una procedura memorizzata e ho due colonne.La prima colonna deve mostrare l'avvio e la seconda colonna deve mostrare la fine di un intervallo di date basato da un parametro di input che è un numero che si designa il trimestre.Sono stato in grado di estrarre quanto segue da Asktom ma ho alcune domande.

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; 
.

Domanda 1. La matematica qui spiegherà i figli ... Non penso che lo farà, ma non sono sicuro di come gestirlo.

Domanda 2. Come aggiungere il parametro di input, "Ingregation" come trimestre specifico?Ho provato a metterlo al posto di Sysdate ma ho bisogno di riformattarlo in data prima credo?

Grazie in anticipo per eventuali risposte.

È stato utile?

Soluzione

Tom Kyte ha givvi la risposta: http:// asktom.Oracle.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)
.

Altri suggerimenti

È possibile convertire un anno numerico e un parametro numerico su 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
.

Il componente temporale di entrambe le date sarà mezzanotte sull'ultimo giorno del trimestre (cioè 24 ore prima dell'inizio del prossimo trimestre).Potresti volere l'ultimo del trimestre alle 23:59:59 dell'ultimo giorno del trimestre se vuoi che la gamma sia comprensiva di tutte le date possibili nel trimestre.

Suggerisco:

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 i parametri interi I_yr e I_Q che rappresentano rispettivamente l'anno e il trimestre.

Nota che Endof rappresenterà la mezzanotte il primo giorno del prossimo trimestre, quindi qualsiasi selezione dovrebbe essere basata su condizioni < "EndOf", non <= "EndOf".(Questo dovrebbe garantire che tutti i tempi dell'ultimo giorno del trimestre siano inclusi.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top