Come posso estrarre e visualizzare l'intervallo di date in base al trimestre in Oracle?
-
13-12-2019 - |
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.
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.)