반응형
- 초보자를 위한 SQL 200제의 문제를 바탕으로 작성되었습니다.
<날짜형 함수 정리>
함수 | 기능 |
MONTHS_BETWEEN | 날짜와 날짜 사이의 개월 수를 출력 |
ADD_MONTHS | 특정 날자에서 개월 수를 더한 날짜 출력 |
NEXT_DAY | 특정 날짜 다음에 돌아오는 날짜 출력 |
LAST_DAY | 특정 날짜가 있는 달의 마지막 날짜 출력 |
TO_CHAR | 날짜형, 숫자형 데이터를 문자형 데이터로 변환 |
TO_DATE | 문자를 날짜형으로 변환 |
[예제26]
1. 이름을 출력하고 입사한 날짜부터 오늘까지 총 몇달을 근무했는지 출력
select ename, months_between(sysdate, hiredate) as 날짜
from emp;
- sysdate: 오늘 날짜 확인하는 함수
- MONTHS_BETWEEN(최신 날짜, 예전 날짜)로 입력
[예제27]
1. 2019년 5월 1일로부터 100달 뒤의 날짜 출력
select add_months(to_date('2019-05-01', 'yyyy-mm-dd'), 100)
from dual;
- TO_DATE(날짜, 형식): 주어진 문자열 또는 컬럼의 데이터를 날자 포맷으로 변환해 주는 형변환 함수
- ADD_MONTHS(기준 날짜, 더할 개월수)
2. 2019년 5월 1일로부터 100일 후의 날짜 출력
select to_date('2019-05-01', 'yyyy-mm-dd') + 100
from dual;
3. day기준이 아닌 months 기준일 경우
select to_date('2019-05-01','yyyy-mm-dd') + interval '100' month
from dual;
- interval : 섬세한 날짜 산술 연산을 가능하게 함.
- 달의 기준을 30일로 해야 할지 31일로 해야 할지 정하기 어렵기 때문에 사용.
- interval은 year, month, day, hour, minute, second까지 다양한 옵션이 있음
4. 2019년 5월 1일부터 3년 5개월 후의 날짜 출력
select to_date('2019-05-01', 'yyyy-mm-dd') + to_yminterval('03-05') as 날짜
from dual;
- TO_TMINTERVAL('year - month')로 표현
[예제28]
1. 오늘부터 앞으로 돌아올 월요일의 날짜가 어떻게 되는지 출력
select sysdate as 오늘, next_day(sysdate, '월요일')
from dual;
2. 오늘부터 100달 뒤에 돌아오는 월요일 날짜 출력
select sysdate as 오늘, next_day(add_months(sysdate, 100), '월요일') as 다음날짜
from dual;
[예제29]
1. 특정 날짜의 마지막 날짜 출력
select '2019-05-22' as 날짜, last_day('2019-05-22') as "마지막 날짜"
from dual;
- LAST_DAY('특정 날짜') : 특정 날짜의 마지막 날짜 출력
2. 오늘부터 이번달 말일까지 총 몇일 남았는지 출력
select sysdate as 오늘, last_day(sysdate) - sysdate as 남은날짜
from dual;
[예제30]
1. 이름이 SCOTT인 사원의 이름과 입사한 요일, 월급을 천 단위로 구분하여 출력
select ename, to_char(hiredate, 'day') as 요일, to_char(sal, '999,999') as 월급
from emp
where ename = 'SCOTT';
- TO_CHAR: 숫자형 데이터를 문자형으로 변환하거나 날짜형 데이터를 문자형으로 변환할때 사용.
- 날짜를 문자로 출력할 때 사용할 수 있는 포맷은 다음과 같음.
연도 | RRRR, YYYY, RR, YY | 주 | WW, IW, W |
월 | MM, MON | 시간 | HH, HH24 |
일 | DD | 분 | MI |
요일 | DAY, DY | 초 | SS |
- 연도에서 'RR' 포맷과 'YY'포맷은 서로 다름. (RRRR과 YYYY의 경우 차이 없음)
- 'YY'는 2000년대를 나타내며, 'RR'은 1900년도를 포함함.
- 'RR'을 조금 더 자세히 표현하면 50년을 기준으로 50년 이상이면 1900년대, 미만이면 2000년대를 나타냄.
- 월급을 천 단위로 표시할 때, 숫자 9는 자릿수이고 이 자리에 0~9까지 어떠한 숫자가 와도 관계 없다는 뜻.
2. 날짜에서 년, 월, 일, 요일 출력하기
select hiredate, to_char(hiredate, 'rrrr') as 연도, to_char(hiredate, 'mm') as 월, to_char(hiredate, 'dd') as 일, to_char(hiredate, 'day') as 요일
from emp
where ename = 'SCOTT';
3. 날짜 컬럼에서 연도/ 월/ 일/ 시간/ 분/ 초를 추출하기 위해 EXTRACT 함수를 사용하는 경우
select ename as 이름, extract(year from hiredate) as 연도,
extract(month from hiredate) as 달,
extract(day from hiredate) as 요일
from emp
where ename = 'SCOTT';
[예제 31]
1. 81년 11월 17일에 입사한 사원의 이름과 입사일 출력
select ename, hiredate
from emp
where hiredate = to_date('81/11/17', 'rr/mm/dd');
- TO_DATE: 문자를 날짜형으로 변환하여 출력
- 날짜형 데이터를 검색할 때 에러 발생을 막으려면 사용할 테이블의 날짜 형식을 확인해야 함.
- 만약 사용하는 테이블마다 형식이 다른 경우 일관된 검색이 불가능하게 되어 쿼리가 복잡해짐.
- 해당 상황에서 일관된 날짜 검색할 수 있게 해주는 함수가 TO_DATE.
반응형
'SQL > SQL 예제' 카테고리의 다른 글
[SQL] Part2 DECODE, CASE (IF문 ) (0) | 2022.08.09 |
---|---|
[SQL] Part2 NVL, NVL2 (NULL 값 처리) (0) | 2022.08.09 |
[SQL] 암시적 형 변환 (0) | 2022.08.09 |
[SQL] Part2 문자열 (0) | 2022.08.07 |
[SQL] 비교연산자 (0) | 2022.08.07 |