2011-09-08 11 views
5

Mam kwerendy w postaci:Znajdź pierwszy i ostatni dzień ostatniego kwartału w ORACLE

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

Jestem naprawdę kłopoty z uzyskaniem prawidłowych dat za ostatni kwartał. Tak więc, powiedzmy aktualna data jest 1 lipca, czyli w trzecim kwartale, chciałbym uzyskać 1 kwietnia jako pierwszy i 30 czerwca jako ostatni dzień ostatniego kwartału (tj. drugi kwartał).

Googled nieco i znalazłem mnóstwo rozwiązań na ten temat, ale każdy z nich obejmował SQL Server i funky metody, które są dostępne tam, nie są dostępne w naszej bazie danych ORACLE (Oracle 10g i 11g).

Oh yeah, a także muszę być w stanie umieścić całość w jednym zapytaniu, jako że jest to ograniczenie umieścić na mnie przez jakiegoś narzędzia, które będą dalej pracować z tym zapytaniu ...:/

Odpowiedz

11

ten jest prostszy , ale nadal nie może być najprostszy sposób:

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

może również użyć podselekcji, tak, aby wykluczyć pewne powtórzenia kodu:

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

Typowe, gdy tylko poprosimy o pomoc, znajdę bloga, który daje mi właściwy pomysł, jak postępować.

Udało się zapowiedzieć razem, ale jest absolutnie, ale - f *** brzydki. :)

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

Robi to, jak się wydaje, ale jeśli ktoś wie o lepszym rozwiązaniu, proszę dać mi znać! (to_date('27-JAN-11') jest tam jako przykładowa data ...)

Edytuj: Naprawiono błąd - dodanie 3 miesięcy do pierwszego dnia kwartału nie zawsze kończy się w tym samym kwartale. Teraz jeszcze brzydszy - cholera, kalendarz gregoriański!

0

Jest to jeden ze sposobów, aby to zrobić, to oszczędza kłopotu z konieczności wypracowania pierwszy i ostatni termin i umieścić wyniki w WHERE dla głównego zapytania:

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

SELECT DATE_CURRENT , TRUNC (DATE_CURRENT 'P'), jak Q1F , LAST_DAY (ADD_MONTHS (TRUNC (DATE_CURRENT 'P'), 2)) jako 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 ( SELECT TO_DATE ('05 .03.2017' , 'DD.MM.YYYY') jak DATE_CURRENT od Podwójnej UNION SELECT TO_DATE ('30 .06.2014' , 'DD.MM.YYYY') jak DATE_CURRENT od Podwójnej 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 )

+0

proszę edytuj swój post, aby kod został sformatowany. Dziękuję Ci. –

Powiązane problemy