본문 바로가기

SQL

9. 날짜함수

1. sysdate : 오늘의 날짜와 시간 출력(인수 없음)

** 날짜 연산
- oracle에서는 날짜 + 숫자, 날짜 - 숫자 가능
- 날짜 - 날짜 : 두 날짜 사이 일(day) 수 리턴

select sysdate + 100 as "100일 이후",
       sysdate - 100 as "100일 이전"
  from dual;



select ename, sysdate, hiredate,
       trunc(sysdate - hiredate) as 근무일수,
       trunc((sysdate - hiredate)/365) as 근속연수
  from emp;

 

다음과 같은 식으로 trunc를 이용해서 시간을 다 날려버릴 수 있다. 

 

 

 


2. add_months : 월 연산

** 사용법 : add_months(날짜,n)
- n > 0, n개월 이후 날짜 리턴
- n < 0, n개월 이전 날짜 리턴

예) 오늘날짜로부터 3개월 이후 날짜
select sysdate, 
       sysdate + 3*30,                -- 잘못된 날짜 연산 결과
       add_months(sysdate,3)    -- 정확한 날짜 연산 결과
  from dual;

확인해보면


두 날짜가 다름을 알 수 있는데 가운데 출력된것은 부정확한 날짜이다. 

매 달이 30일로 고정이 아니기 때문.


3. months_between : 두 날짜 사이의 개월수 리턴

** 사용법 : months_between(날짜1, 날짜2)
- 날짜1 > 날짜2 : 양수 리턴
- 날짜1 < 날짜2 : 음수 리턴

select ename, sysdate, hiredate,
       months_between(sysdate, hiredate) as 입사개월수,
       months_between(hiredate, sysdate) as 입사개월수2
  from emp;

 

4. next_day : 돌아오는 특정 요일 날짜 리턴

** 사용법 : next_day(날짜,요일)
- 요일 전달 방법 : 한글, 한글축약형, 영문, 영문축약형, 숫자
- 일요일(1), 월요일(2), 화요일(3), ....

날짜 언어가 한글일 경우
alter session set nls_date_language = 'korean';

select sysdate, 
       next_day(sysdate,'금요일'),
       next_day(sysdate,'금'),
       next_day(sysdate,1)       -- 돌아오는 일요일 날짜 리턴
  from dual;

날짜 언어가 영어일 경우)
alter session set nls_date_language = 'american';

select sysdate, 
       next_day(sysdate,'FRI')
  from dual;
  


5. last_day : 특정 날짜가 포함된 월의 마지막 날짜 리턴

** 사용법 : last_day(날짜)

select sysdate, last_day(sysdate)
  from dual;


  

6. round / trunc : 날짜의 반올림, 버림 수행

** 사용법 : round(날짜[, 자리수])
- 자리수 : month, year
- 자리수 생략 시 시간 단위에서 반올림/버림 진행

select sysdate, 
       round(sysdate),                    
       trunc(sysdate),                     
       round(sysdate, 'month'),      
       trunc(sysdate, 'month'),       
       round(sysdate, 'year'),        
       trunc(sysdate, 'year')     
  from dual;

 

 

다음과 같은 결과를 얻을 수 있다. 

 


** 주의 : round, trunc 사용 시 반올림 또는 내림 자리수에 'day' 사용 금지
select sysdate, 
       round(sysdate),           -- 2024/10/18 00:00:00
       round(sysdate,'day')      -- 2024/10/20 00:00:00(시간단위에서 반올림 한 날짜 리턴 불가)
  from dual;

 

그러므로 내림 자리수에 'day'를 사용하면 결과가 이상하게 나오게 된다. 

 

 

[ 연습 문제 ]
1. EMP 테이블에서 10번 부서원의 현재까지의 근무 월수를 계산하여 출력
select ename, hiredate, 
       trunc(months_between(sysdate,hiredate)) as 근무월수
  from emp
 where deptno = 10;

 

2. EMP 테이블에서 입사한 달의 남은 근무 일수를 계산하여 출력하여라.  
--   단, 토요일과 일요일도 근무일수에 포함한다.
select ename, hiredate, last_day(hiredate),
       last_day(hiredate) - hiredate as 나머지근무일수
  from emp;

 

3. EMP 테이블에서 각 직원의 이름, 입사일, 급여검토일 출력
--   단, 급여검토일은 입사날짜로부터 100일 뒤 돌아오는 월요일
alter session set nls_date_language = 'korean';

select ename, hiredate, next_day(hiredate + 100, '월요일')
  from emp;

 

 

'SQL' 카테고리의 다른 글

11.변환함수(2)  (1) 2024.10.18
10. 변환함수(1)  (0) 2024.10.18
8. 일반함수(2), 숫자함수  (0) 2024.10.18
7. 일반함수(1)  (1) 2024.10.16
6. 문자열 함수(2)  (2) 2024.10.16