오라클을 사용하는 업무 중에 없는 날짜를 조회에서 SQL 에러가 발생했던 일이 있었다.
하여 오늘은 이에 대한 내용을 정리하려 한다.
Oracle에서 날짜 연산하기
INTERVAL 로 이전 달 출력하기 ( YYYYMM 포맷 )
SELECT TO_CHAR(SYSDATE - (INTERVAL '1' MONTH),'YYYYMM') FROM DUAL;
-- ORA-01839 에러 발생
SELECT TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,'YYYYMM'),'YYYYMM') - (INTERVAL '1' MONTH),'YYYYMM') FROM DUAL;
-- 202304
위에서 에러가 발생하는 이유는 다음과 같다.
현재 날짜는 5월 31일이고 1 Month를 빼면 4월 31을 찾게되며 없는 날짜를 조회하는 일이 발생하여,
SQLDataException: ORA-01839 가 출력되는 것을볼 수 있다.
굳이 INTERVAL을 써서 이전 달을 출력할 수는 있지만 가독성이 많이 떨어지는 것 같다.
ADD_MONTHS 로 이전 달 출력하기 ( YYYYMM 포맷 )
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYYMM') FROM DUAL;
-- 202304
지난 달은 음수, 앞선 달은 양수로 표기하여 원하는 달을 출력할 수 있다.
숫자 연산을 통해 이전 달 출력하기 ( YYYYMM 포맷 )
SELECT TO_CHAR(SYSDATE - 31,'YYYYMM') FROM DUAL;
-- 202304
숫자 연산을 하게되면 날짜를 기준으로 더하기/빼기를 수행한다.
최대 날짜가 31일이므로 31일을 빼서 전 달을 출력하였다.
MySQL 로 날짜 연산하기
DATE_ADD / DATE_SUB로 이전 달 출력하기
SELECT DATE_ADD(NOW(), INTERVAL -1 MONTH);
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
-- 2023-04-30 07:02:49
SELECT DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 MONTH),'%Y-%m');
SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH),'%Y-%m');
-- 2023-04-30
오라클과 달리 INTERVAL로 연산했을 때,
4.31과 같이 없는 날짜를 조회하지않고 30일로 바꿔 출력해주는 것을 확인할 수 있다.
지난 달을 출력할 때는 DATE_SUB를 쓰고, 앞선 달을 출력할 때는 DATE_ADD를 사용하면 된다.
DATE_ADD에서 음수를 매개변수로 하여 이전 달을 출력할 수도 있다.
정리
오라클의 경우 방법이 다양해서 상황에 따라 어느 것을 쓰는 게 좋을 지 고민이 필요할 것 같은데,
지금 생각으로는 통일성을 위해 한 프로젝트 내에서는 동일하게 사용하는게 좋지않을까 한다.
MySQL이 좀 더 직관적이라 쓰기 편할 것 같다.
'SQL' 카테고리의 다른 글
[Oracle/MySQL] CONCAT, 문자열 합치기 (0) | 2023.06.08 |
---|---|
[MySQL] REGEXP, 정규표현식을 이용하여 검색하기 (0) | 2023.06.06 |
[Oracle/MySQL] NVL과 IFNULL, COALESCE로 널 값 처리하기 (0) | 2023.05.24 |
[Oracle/MySQL] DATE_FORMAT과 TO_CHAR, 날짜 출력하기 (0) | 2023.05.21 |
[Oracle/MySQL] SUBSTR과 SUBSTRING, 문자열 자르기 (5) | 2023.05.20 |