2011-09-08 19 views
5

Ho una domanda del tipo:Trova primo e ultimo giorno dell'ultimo quarto in Oracle

select * 
from X 
where <some_date is in the last quarter> 

sono davvero problemi con ottenere le date corrette per l'ultimo trimestre. Quindi, dire che la data corrente è 1 luglio, vale a dire nel terzo trimestre, mi piacerebbe ottenere il 1 aprile come prima e la 30 giugno come l'ultimo giorno dell'ultimo quarto (cioè il secondo trimestre).

su Google un po 'e ho trovato un sacco di soluzioni su questo, ma ognuno di loro coperti di SQL Server e le modalità funky che sono disponibili non ce ne sono disponibili sul nostro database Oracle (Oracle 10g e 11g).

Oh sì, e anche ho bisogno di essere in grado di mettere il tutto in una query, come quello è una restrizione messo su di me da qualche strumento che continuerà a collaborare con questa query ...:/

risposta

11

Questo è più semplice , ma potrebbe ancora non essere il modo più semplice:

SELECT 
    ADD_MONTHS(TRUNC(SYSDATE, 'Q'), -3) AS First, 
    TRUNC(SYSDATE, 'Q') - 1 AS Last 
FROM DUAL 

Forse si potrebbe anche usare una selezione secondaria, come questo, per escludere qualche ripetizione di codice:

SELECT 
    ADD_MONTHS(D, -3) AS First, 
    D - 1 AS Last 
FROM (SELECT TRUNC(SYSDATE, 'Q') AS D FROM DUAL) 
0

Tipico, non appena chiedo aiuto trovo qualche blog che mi dà l'idea giusta su come procedere.

Riuscito a mettere insieme qualche dichiarazione, tuttavia è assolutamente ma fottutamente brutto. :)

select 
    TRUNC(ADD_MONTHS(sysdate, -3),'Q') as first, 
    LAST_DAY(TRUNC(ADD_MONTHS(sysdate, -3),'Q')+ 85) as last 
from dual; 

Questo fa il trucco come sembra, se qualcuno sa di una soluzione migliore, per favore fatemelo sapere! (to_date('27-JAN-11') è lì come una data di esempio ...)

Edit: Corretto un bug - l'aggiunta di 3 mesi per il primo giorno di un quarto non sempre finiscono nello stesso trimestre. Ora è ancora più brutto - maledetto calendario gregoriano!

0

questo è un modo per farlo, si salva il fastidio di dover lavorare fuori le prime e ultime date e mettere i risultati in una clausola in cui per la query principale:

select 
    *, 
    round(to_number(to_char(some_date, 'mm'))/4) as quarter 
from x 
where round(to_number(to_char(some_date, 'mm'))/4) = round(to_number(to_char(sysdate, 'mm'))/4) 
2
SELECT MIN (t), MAX (LAST_DAY (t)) 
    FROM ( SELECT ADD_MONTHS (TRUNC (SYSDATE, 'yyyy'), LEVEL - 1) t, 
        TO_CHAR (ADD_MONTHS (TRUNC (SYSDATE, 'yyyy'), LEVEL - 1), 'Q') 
         r 
       FROM DUAL 
     CONNECT BY LEVEL <= 12) a 
WHERE a.r = 4; 
0
SELECT DATE_CURRENT 
    , TRUNC (ADD_MONTHS (DATE_CURRENT, -6), 'Q')     AS FIRST 
    , LAST_DAY (TRUNC (ADD_MONTHS (DATE_CURRENT, -6), 'Q') + 85) AS LAST 
    , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-1))     AS PREVIOUS_QUARTER_END 
    , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-1)),-3)+1 AS PREVIOUS_QUARTER_START 
FROM 
     (
      SELECT TO_DATE ('31.07.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL 
     UNION SELECT TO_DATE ('30.06.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL 
     UNION SELECT TO_DATE ('30.04.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL 
     UNION SELECT TO_DATE ('31.03.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL 
     ) 
order by DATUM; 
1
SELECT 
    TRUNC(SYSDATE, 'Q')AS FIRST_DAY, 
    last_day(add_months(TRUNC(SYSDATE, 'Q'),2)) as LAST_DAY     
FROM DUAL; 
0

SELEZIONA DATE_CURRENT , TRUNC (DATE_CURRENT, 'Q') AS Q1F , LAST_DAY (ADD_MONTHS (TRUNC (DATE_CURRENT, 'Q'), 2)) come Q1L , LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 1)) AS Q2F , ADD_MONTHS (LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 1)), - 3) +1 AS Q2L , LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 4)) AS Q3F , ADD_MONTHS (LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 4)), - 3) +1 AS Q3L , LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 7)) AS Q4F , ADD_MONTHS (LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 7)), - 3) +1 AS Q4L , LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 10)) AS Q5F , ADD_MONTHS (LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 10)), - 3) +1 AS Q5L , LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 13)) AS Q6F , ADD_MONTHS (LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 13)), - 3) +1 AS Q6L , LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 16)) AS Q7F , ADD_MONTHS (LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 16)), - 3) +1 AS Q7L , LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 19)) AS Q8F , ADD_MONTHS (LAST_DAY (ADD_MONTHS (trunc (DATE_CURRENT, 'Q'), - 19)), - 3) +1 AS Q8L FRO M ( SELEZIONA TO_DATE ('05 .03.2017' , 'GG.MM.AAAA') AS DATE_CURRENT FROM DUAL UNION SELECT TO_DATE ('30 .06.2014' , 'GG.MM.AAAA') AS DATE_CURRENT FROM DUAL UNION TO_DATE SELECT ('30 .04.2014' , 'GG.MM.AAAA') AS DATE_CURRENT FROM DUAL UNION SELECT TO_DATE ('31 .03.2014' , 'GG.MM.AAAA') AS DATE_CURRENT FROM DUAL )

+0

prega modifica il tuo post in modo che il codice sia formattato. Grazie. –

Problemi correlati