개발새발 방이일지

[오라클] 달의 첫 날, 마지막 날 구하기 본문

개발일지/DB

[오라클] 달의 첫 날, 마지막 날 구하기

방이 2020. 7. 29. 10:45

쿼리를 보다가 적어두면 유용할거 같아서 적어본다.

1. 달의 마지막 날 구하기

오라클에서는 달의 마지막 날을 구할 수 있도록 LAST_DAY 라는 함수를 지원해준다.

-- LAST_DAY(날짜)
LAST_DAY(SYSDATE)

-- 이번달 마지막 날 구하기
SELECT LAST_DAY(SYSDATE)
FROM   DUAL;

-- 특정달 마지막 날 구하기
SELECT LAST_DAY('20200201')
FROM   DUAL;

위에 적어뒀듯이 특정달의 마지막 날을 구하려고 한다면 날짜를 일까지 다 적어줘야한다. 2월달을 구하려고 LAST_DAY(202002) 이렇게 적으면 오류가 발생한다. 이점 기억하기!

2. 달의 첫 날 구하기

검색해보니 특이하게 LAST_DAY라는 함수는 있으면서 FIRST_DAY 같은 함수는 없었다. 하지만 해결책은 있는법. 함수가 없는 대신 TRUNC를 이용하여 첫날을 구할 수 있었다.

-- 달의 첫날 구하기
TRUNC(SYSDATE, 'MM')

-- 현재 달의 첫날 구하기
SELECT TRUNC(SYSDATE, 'MM')
FROM   DUAL;

TRUNC 함수는 보통 소수점 아래를 자를 때 많이 사용한다. 하지만 소수점 아래를 자를 때 뿐만 아니라 다른 옵션들도 가지고 있다. 시간을 초기화 한다거나 일, 월을 초기화할 수가 있다. 예를들어 TRUNC(SYSDATE, 'YYYY')를 쓰면 월이 초기화되서 그 해의 1월1일을 구할 수 있고, 위의 쿼리처럼 TRUNC(SYSDATE,'MM')을 쓰면 일이 초기화되서 해당 달의 1일을 구할 수 있다.

-- YYYY, MM, IW 현재기준(7월) 결과값 보기
-- IW 의 경우 해당 주의 첫 요일의 날짜를 출력(월요일)
SELECT TRUNC(SYSDATE, 'YYYY') AS YEAR	-- 결과 : 2020-01-01
     , TRUNC(SYSDATE, 'MM') AS MONTH	-- 결과 : 2020-07-01
     , TRUNC(SYSDATE, 'IW') AS DAY1		-- 결과 : 2020-07-27
     , TRUNC(TO_DATE('20200801000000', 'YYYYMMDDHH24MISS'), 'IW') AS DAY2 -- 결과 : 2020-07-27
FROM   DUAL;

-- YEAR, MONTH, DAY 로도 사용 가능
-- DAY 의 경우 해당 주의 첫 요일의 날짜를 출력(일요일)
SELECT TRUNC(SYSDATE, 'YEAR') AS YEAR	-- 결과 : 2020-01-01
     , TRUNC(SYSDATE, 'MONTH') AS MONTH	-- 결과 : 2020-07-01
     , TRUNC(SYSDATE, 'DAY') AS DAY1	-- 결과 : 2020-07-26
     , TRUNC(TO_DATE('20200801000000', 'YYYYMMDDHH24MISS'), 'DAY') AS DAY2 -- 결과 : 2020-07-26
FROM   DUAL;

IW나 DAY의 경우 그 주의 첫주를 불러오기 때문에 위의 쿼리에서처럼 8월 1일을 넣어도 해당 주의 첫 요일의 날짜를 출력한다. IW는 그 주의 시작 요일을 월요일로 잡고 DAY는 일요일로 잡는다는 것을 참고하자.

3. 날짜 다루기

추가적으로 몇가지 유용한 함수나 기능들이 있기에 적어본다.

-- 이전달의 첫날 구하기
SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1)  -- 결과값 : 2020-06-01
FROM   DUAL;

-- 다음달의 첫날 구하기
SELECT ADD_MONTHS(TRUNC(SYSDATE,'MM'), 1)    -- 결과값 : 2020-08-01
FROM   DAUL;

-- 이전주의 첫번째 날 구하기
SELECT TRUNC(SYSDATE-7, 'IW')               -- 결과값 : 2020-07-20
FROM   DUAL;

-- 다음주의 첫번째 날 구하기(일요일 기준)
SELECT NEXT_DAY(SYSDATE, 1)                 -- 결고값 : 2020-08-02
FROM   DUAL;

ADD_MONTHS 는 입력한 날짜에 +, - 한 달의 첫 일을 구한다.  두달 전의 첫날을 구한다면 -2를 해주면 되는것이다. 

오라클에서는 NEXT_DAY 함수를 지원해서 기준일자 다음에 오늘 날짜를 구할 수가 있다. 1은 일요일, 2는 월요일 ··· 이 되겠다. 참고로 한글로 적어도 동작한다. NEXT_DAY(SYSDATE, '일') 이라거나 NEXT_DAY(SYSDATE, '일요일') 로 적어도 동작한다. 다만, P/L SQL 툴에서만 그런건지는 모르겠는데 NEXT_DAY(SYSDATE, 'SUN') 이라거나 NEXT_DAY(SYSDATE, 'SUNDAY')가 동작을 안하더라;; 서버에 올라가면 동작할지는 모르겠지만 참고하길..

 

나중에 내가 참고하려고 정리해두는 것이지만 누군가에게도 유용하게 쓰이길 :)

※ 열심히 공부해 나가는 과정이며 제가 참고하기 위해 만든 스토리이기 때문에 틀린 부분이 있을 수도 있습니다. 만약 틀린 부분이 있다면 댓글 부탁드립니다.

'개발일지 > DB' 카테고리의 다른 글

[DBMS] TOOL 단축키 정보  (0) 2020.07.31
[오라클] TABLESPACE  (0) 2020.03.17
[오라클] ORA-00911 : 문자가 부적합합니다.  (0) 2019.11.21
[Table Set] 테이블 찾기  (0) 2019.11.09
[Table Set] 테이블 생성, 수정, 삭제  (0) 2019.11.09
Comments