달력쿼리질문입니다 0 8 1,479

by 감사 [SQL Query] [2015.04.07 13:45:57]


TABLE.JPG (14,333Bytes)
쿼리02.JPG (33,918Bytes)
결.JPG (17,304Bytes)

테이블은 Z_DATE_TEST 입니다.

첫번째 사진이 위 테이블입니다. 그리고 이것에 중간에 빠져 있는 날짜를 추가해서 조회하려고 하는데요

두번째 사진처럼 쿼리를 작성하였는데요 세번째 사진처럼 결과가 나옵니다.

중간에 빠진 날짜가 함께 나오지 않습니다.

1일부터 31일까지 정렬하여 조회하고 싶습니다.

어떻게 바꿔야 조회를 할 수 있을까요?

고수님들 가르쳐주세요!!

 

by 개발뉴비 [2015.04.07 13:52:35]

FROM_DT와 TO_DT 값의 사이에 있는 모든 날짜를 조회하고 싶으신건가요??

아니면 가장 처음에 있는 FROM_DT의 날짜부터 마지막 TO_DT 까지의 모든 날짜를 조회하고 싶으신건가요?


by 감사 [2015.04.07 13:55:19]

CONNECT BY LEVEL을 해서 2014-01-01일부터 2014-01-31일까지 모두 조회하고 싶었습니다.


by 개발뉴비 [2015.04.07 14:12:40]
-- 이런걸 원하시는건가요??
SELECT (DT + LEVEL - 1) AS DT 
FROM (SELECT TO_DATE('2014-01-01', 'YYYY-MM-DD') DT FROM DUAL) AA 
CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(AA.DT), 'DDD') - TO_CHAR(AA.DT, 'DDD') + 1

 


by 창조의날개 [2015.04.07 14:17:54]

WITH TT(FROM_DT, TO_DT) AS(
    SELECT '2014-01-01', '2014-01-09' FROM DUAL UNION ALL
    SELECT '2014-01-12', '2014-01-18' FROM DUAL UNION ALL
    SELECT '2014-01-21', '2014-02-02' FROM DUAL
)
SELECT DISTINCT FROM_DT, TO_DT, TO_DATE(FROM_DT,'YYYY-MM-DD')+LEVEL-1 AS DT
FROM TT
CONNECT BY LEVEL <= TO_DATE(TO_DT,'YYYY-MM-DD') - TO_DATE(FROM_DT,'YYYY-MM-DD') + 1
ORDER BY FROM_DT, TO_DT, DT
;

 


by 감사 [2015.04.07 14:18:30]

개발뉴비님 감사합니다.

원래는 기존의 테이블을 이용하여 쿼리를 수정하고 싶었는데요 새로운 방법도 알게 되서

쿼리공부하는데 도움이 되고 또 배울 수 있었습니다. 가르쳐주셔서 감사합니다.


by 감사 [2015.04.07 14:20:56]

창조의 날개님  저의 원래 결과값이 조회됩니다.

 


by 마농 [2015.04.07 15:26:38]
-- 그냥 1월의 일자를 모두 보고싶은 거군요?
-- 테이블과는 전혀 상관이 없는 질문인 듯.
SELECT ym + LEVEL - 1 dt
  FROM (SELECT TO_DATE('201401', 'yyyymm') ym FROM dual)
 CONNECT BY LEVEL <= LAST_DAY(ym) - ym + 1
;

-- 테이블을 연관 지으려면 다음과 같이...
WITH z_date_test AS
(
SELECT TO_DATE('20140101', 'yyyymmdd') from_dt, TO_DATE('20140109', 'yyyymmdd') to_dt FROM dual
UNION ALL SELECT TO_DATE('20140112', 'yyyymmdd'), TO_DATE('20140118', 'yyyymmdd') FROM dual
UNION ALL SELECT TO_DATE('20140121', 'yyyymmdd'), TO_DATE('20140202', 'yyyymmdd') FROM dual
)
, calendar AS
(
SELECT ym + LEVEL - 1 dt
  FROM (SELECT TO_DATE('201401', 'yyyymm') ym FROM dual)
 CONNECT BY LEVEL <= LAST_DAY(ym) - ym + 1
)
SELECT c.dt
     , COUNT(d.from_dt) cnt
  FROM calendar c
     , z_date_test d
 WHERE c.dt BETWEEN d.from_dt(+) AND d.to_dt(+)
 GROUP BY c.dt
 ORDER BY c.dt
;

 


by 감사 [2015.04.07 16:03:39]

마농님 가르쳐주셔서 감사합니다.

항상 많이 배우고 있습니다.  정말 감사합니다.

 

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