oracle에서 mysql로 변환시 쿼리 질문입니다 0 1 1,888

by 헐이거뭐임 [MySQL] [2018.01.25 11:28:20]


select to_char(to_date(T.FROMDATE, 'yyyymmdd') + level - 1, 'yyyymmdd') YMD  from dual, T
connect by level <= ( select to_date(T.TODATE, 'yyyymmdd') - to_date(T.FROMDATE, 'yyyymmdd') + 1 from T)

 

시작일과 종료일을 넣어주면 

시작일 부터 종료일 사이의 모든 날짜를 출력해주는 쿼리인데

mysql에선 connect by를 지원하지 않아 어떤식으로 풀어가야할지 감이 잡히지 않습니다.

 

위 쿼리를 mysql로 바꾸려면 어떻게 해야할까요?

by 마농 [2018.01.25 12:20:44]

1. 숫자가 저장되어 있는 copy_t 테이블을 미리 만들어 두고 사용하세요.
2. 일자가 저장되어 있는 달력 테이블을 미리 만들어 두고 사용하세요.
3. mariaDB 인 경우 시퀀스 테이블 (예 : seq_1_to_100) 을 이용할 수 있습니다.

-- 1. copy_t
SELECT DATE_FORMAT(sdt + INTERVAL lv - 1 DAY, '%Y%m%d') dt
  FROM (SELECT 1 lv
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9
        ) copy_t
 INNER JOIN
       (SELECT '20180101' sdt, '20180107' edt) a
    ON lv <= DATEDIFF(edt, sdt) + 1
;
-- 2. calendar_t
SELECT dt
  FROM (SELECT '20180101' dt
        UNION ALL SELECT '20180102'
        UNION ALL SELECT '20180103'
        UNION ALL SELECT '20180104'
        UNION ALL SELECT '20180105'
        UNION ALL SELECT '20180106'
        UNION ALL SELECT '20180107'
        UNION ALL SELECT '20180108'
        UNION ALL SELECT '20180109'
        ) calendar_t
 INNER JOIN
       (SELECT '20180101' sdt, '20180107' edt) a
    ON dt BETWEEN sdt AND edt
;
-- 3. mariaDB seq
SELECT DATE_FORMAT(sdt + INTERVAL seq - 1 DAY, '%Y%m%d') dt
  FROM seq_1_to_9
 INNER JOIN
       (SELECT '20180101' sdt, '20180107' edt) a
    ON seq <= DATEDIFF(edt, sdt) + 1
;

 

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