안녕하세요!
oracle , postgresql 쿼리를 mysql 쿼리로 변경하는도중 어려움을 느껴 질문드립니다.
postgresql
SELECT TMP_DATE.STATUS_DATE FROM( WITH RECURSIVE DUAL_TABLE AS( SELECT TO_DATE('202001', 'yyyymm') STATUS_DATE UNION ALL SELECT STATUS_DATE + 1 from DUAL_TABLE ) SELECT TO_CHAR(STATUS_DATE, 'yyyymm') STATUS_DATE FROM DUAL_TABLE limit TO_DATE('202008', 'yyyymm') - TO_DATE('202001', 'yyyymm') + 1 ) TMP_DATE group by TMP_DATE.STATUS_DATE order by TMP_DATE.STATUS_DATE;
oracle
SELECT STATUS_DATE FROM( SELECT DISTINCT TO_CHAR(TO_DATE('202001', 'yyyymm') + LEVEL - 1, 'yyyymm') STATUS_DATE FROM DUAL CONNECT BY LEVEL <= TO_DATE('202008', 'yyyymm') - TO_DATE('202001', 'yyyymm') + 1 ) ORDER BY STATUS_DATE;
결과
202001 |
202002 |
202003 |
202004 |
202005 |
202006 |
202007 |
202008 |
제가 mysql 쿼리로 비슷하게 짜면 값이 null 로 나오거나 한줄만 나오는 일이있습니다. 해결방안에 도움을 주시면 감사하겠습니다 . (__)
또한 mysql 쿼리에서
SELECT DATE_FORMAT(STR_TO_DATE('202008', '%Y%m'),'%Y%m');
쿼리 실행시 202008로 잘 찍히고
SELECT DATE_FORMAT(DATE_ADD(STR_TO_DATE('202008','%Y%m'), interval - 1 Month ), '%Y%m');
쿼리 실행시 null값으로 반환되는데 이유를 알 수 있을까요?
잘부탁드립니다.
1. 해당 쿼리가 동작하지 않는 이유는
- 함수를 부분 부분 끊어서 실행해 보시면 알 수 있을 것 같습니다.
- 첫번째 함수에서부터 결과가 이상하네요. STR_TO_DATE('202008','%Y%m') -> 2020-08-00
2. MySQL 버전이 어떻게 되나요?
- WITH Recursive 구문이 지원되는 버전인지?
WITH RECURSIVE t AS ( SELECT '202001' ym UNION ALL SELECT DATE_FORMAT(CONCAT(ym, '01') + INTERVAL 1 MONTH, '%Y%m') FROM t WHERE ym < '202008' ) SELECT * FROM t ;
답변 정말 감사드립니다.
계속 테스트한결과
WITH RECURSIVE DUAL_TABLE AS( SELECT STR_TO_DATE( CONCAT('202001','01'),'%Y%m%d') AS STATUS_DATE UNION ALL SELECT DATE_ADD( STATUS_DATE, INTERVAL + 1 Month ) AS STATUS_DATE FROM DUAL_TABLE WHERE STATUS_DATE < STR_TO_DATE( CONCAT('202008','01'),'%Y%m%d') ) SELECT DATE_FORMAT(STATUS_DATE,'%Y%m') FROM DUAL_TABLE;
아래와 같이 sql문을 짰는대 간단하게 짜신거보고 감탄하였습니다.
답변 감사드립니다.