날짜 구간 쿼리 좀 도와 주세요~ 0 7 830

by 산달 [SQL Query] [2017.03.08 08:25:53]


입사일자로 부터 현재일자 기준으로 1년 단위로 구간을 만들려고 하는데 생각처럼 쉽지가 않아 질문드립니다.

입사일자 : 20120602

결과 :

entn_dt         end_dt

20120602      20130228

20130301      20140228

20140301      20150228

20150301      20160229

20160301      20170228

20170301      현재날짜

도움 주셔서 감사드립니다.

좋은 하루 되세요.~

by jkson [2017.03.08 09:08:43]
--머리가 안 굴러가서 복잡하네요;
select greatest(:sdt,fdt) fdt, least(to_char(sysdate,'yyyymmdd'), tdt) tdt
  from
    (
    select :sdt,yyyy||'0301' fdt
         , to_char(last_day(to_date(to_char(yyyy + 1)||'0201','yyyymmdd')),'yyyymmdd') tdt
      from
        (
         select to_number(substr(:sdt,1,4)) + level - 1 yyyy
           from dual 
        connect by level <= to_number(to_char(sysdate,'yyyy')) - to_number(substr(:sdt,1,4)) 
                          + case when to_char(sysdate,'yyyy')||'0301' > to_char(sysdate,'yyyymmdd') then 0 else 1 end
        )
    )  

 


by 랑에1 [2017.03.08 10:19:45]
SELECT MIN(dt) entn_dt, MAX(dt) end_dt
FROM 
(
  SELECT dt, CASE WHEN TO_CHAR(dt, 'MM') < '03' THEN  TO_CHAR(dt, 'YYYY') ELSE TO_CHAR(TO_NUMBER(TO_CHAR(dt, 'YYYY')) + 1) END year
  FROM 
  (
    SELECT TO_DATE('20120602', 'yyyymmdd') + LEVEL - 1 dt
    FROM dual 
    CONNECT BY LEVEL <= SYSDATE - TO_DATE('20120602', 'yyyymmdd') + 1
  )
)
GROUP BY year
ORDER BY year

 


by 필상 [2017.03.08 11:08:17]

SELECT GREATEST(ST_DATE, ST),
       LEAST(END_DATE, DT)
  FROM ( SELECT TO_DATE(TO_CHAR(TO_NUMBER(SUBSTR(TT, 1, 4)) + LEVEL - 2) || '0301', 'YYYYMMDD') AS ST_DATE,
                LAST_DAY(TO_DATE(TO_CHAR(TO_NUMBER(SUBSTR(TT, 1, 4)) + LEVEL - 1) || '02', 'YYYYMM')) AS END_DATE,
                TT, ST, DT
           FROM DUAL,
                ( SELECT '20130124' AS TT, TO_DATE('20130124', 'YYYYMMDD') AS ST, TRUNC(SYSDATE, 'DD') AS DT FROM DUAL)
         CONNECT BY LEVEL <= TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) - TO_NUMBER(SUBSTR(TT, 1, 4)) + 2 )
 WHERE END_DATE > ST


by 산달 [2017.03.08 17:04:24]

고수님들 감사합니다~ 좋은 하루 되세요~


by 마농 [2017.03.09 09:50:34]

현재월 기준으로 구간을 나눈다고 생각하고 쿼리 작성했는데.
위 답변을 보니 3월을 기준으로 나누는 것일 수도 있겠네요.
3월 기준으로도 풀어봤습니다.


SELECT TO_CHAR(GREATEST(sdt , ADD_MONTHS(edt, -12*(LEVEL-1))  ), 'yyyymmdd') sdt
     , TO_CHAR(LEAST(sysdate, ADD_MONTHS(edt, -12*(LEVEL-2))-1), 'yyyymmdd') edt
  FROM (SELECT TO_DATE('20120602', 'yyyymmdd') sdt
             , TRUNC(sysdate, 'mm') edt  -- 현재월 기준
--           , ADD_MONTHS(TRUNC(ADD_MONTHS(TRUNC(sysdate, 'mm'), -2), 'yy'), 2) edt -- 3월 기준
          FROM dual)
 CONNECT BY LEVEL <= CEIL(MONTHS_BETWEEN(edt, sdt)/12) + 1
 ORDER BY sdt
;

by jkson [2017.03.09 10:16:26]

오~~ 완전 간단하네요. 그리고 제가 작성한 거 다시 보니 엉망이네요ㅋㅋ

답도 3월 이전 값이 들어가면 잘못 나오는 쿼리였네요.


by jkson [2017.03.09 10:23:05]

아 수정하셨네요~ 뭔가 이상해서 계속 넣어보니 edt가 현재월 기준으로 나오는 거였네요. 수정하신 것도 엄청 간단하네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입