티스토리 뷰

SQL

[SQL] 4.날짜함수 & 변환함수

superkong1 2018. 1. 21. 22:24
반응형

4. 날짜함수 & 변환함수

우선 날짜함수부터 살펴보면,
날짜함수는 대부분 데이터 관리 업무를 하는 직무에서 사용되는 것처럼 보이나
실제 어떤 함수를 만들때 날짜 확인 및 계산 작업을 거쳐야 할 수 있어
한 번쯤은 짚고 넘어가야 한다.

※ SQL Gate에서 오늘 날짜 보는 방법
: Select sysdate from dual;

현재 시간을 emp 데이터와 연관지어 보자.
Select ename, sysdate - hiredate ← 소수점 버리기(0은 생략 가능)
from emp;

첫 줄 13214.886에서 13214는 Day(일),
886은 시간/분/초를 환산한 것이다.

날짜, 시간과 관련된 함수로는
months_between, add_months, next_day, last_day 등이 있다.

설명전에 이 글은 18/01/21, 일요일에 작성되어
sysdate에 있는 데이터가 이것임을 인지하고 참고해야한다.

months_between

날짜와 날짜 사이의 개월 수를 출력하는 함수(최신 날짜를 앞에 쓴다)

Select ename, months_between(sysdate, '88/01/22')
from emp;

본인의 생일과 현재를 비교해보았다.(현재 18/01/21, 내일 생일)
단순 수치 뺄셈으로 진행되므로 360달(30살)에 가까운 나이가 출력되었다.
한국 나이는 31살이다.

add_months

특정 날짜 몇 개월 뒤의 날짜를 출력하는 함수(기준 날짜를 앞에 쓴다)

Select add_months(sysdate, 1)
from dual;

add_months(기준 날짜 데이터, 앞의 데이터에서 x달 뒤의 날짜 x)

next_day

특정 날짜 다음에 오늘 특정 요일을 출력하는 함수(기준 날짜를 앞에 쓴다)

Select next_day(sysdate, '화요일')
from dual;

다음 화요일의 날짜가 나온다.

last_day

특정 날짜가 속한 달의 마지막 날짜를 출력하는 함수

Select sysdate, last_day(sysdate)
from dual;

날짜함수와 변환함수를 한 번에 묶어서 설명하는 것은
사실 날짜함수를 다루려면 날짜를 다양한 포맷으로 변환하는 방법을
알아야 하는데, 이것이 변환함수와 연결된다.

변환함수를 알려면 SQL의 데이터 유형을 알아야한다.
SQL에는

  1. 문자형
  2. 숫자형
  3. 날짜형

3가지의 데이터 유형이 있다.

예를 들어, 숫자형 12문자형 12는 다르게 인식된다.

문자형 12는 숫자가 아닌 '문자'12이므로 12 + 1 = 13과 같은 연산을 할 수 없다.
당연히 날짜형도 날짜형끼리의 연산만 가능하다.

예를 들어 a를 12(문자형 데이터)라 하고
ⓐ a + 1(숫자형 데이터)을 실행하면 오류 발생,
ⓑ a + 1(문자형 데이터)을 실행하면 121이 출력된다.

하지만 실제 실행 결과는 다를 수 있는데, 이는 optimizer가 자동으로 수정해준 것이다. optimizer에 대해서는 차차 알아보도록 하겠다.

기본적인 변환함수에는 to_char(문자형으로 변환),
to_number(숫자형으로 변환),
to_date(날짜형으로 변환) 등이 있다.

여기서 to_char는 날짜형(date) 데이터의 포맷을 변경하여
출력할 수 있는데, 그 형식은 아래와 같다.

select hiredate, to_char(hiredate, 'RRRR'), ← 년도 네 자리만 출력
to_char(hiredate, 'MM'), ← 월 두 자리만 출력
to_char(hiredate, 'DD'), ← 날짜 두자리만 출력
to_char(hiredate, 'RRRR/MM/DD'), ← 년도/월/날짜 출력
to_char(hiredate, 'DAY'), ← 요일을 '월요일' 형태로 출력
to_char(hiredate, 'DY'), ← '요일' 단어 제거 후 출력(ex- 월, 화, 수….)
to_char(hiredate, 'D') ← 일요일이 1, 토요일이 7로 출력됨
from emp;

※RRRR/MM/DD 혹은 RR/MM/DD 형식으로 출력이 안 될 경우
현재 내가 접속한 세션의 날짜 형식을
select*from nls_session_parameters;
로 확인해보면 아래 표시한 부분이 YY/MM/DD의 형태로 되어있을 것이다.

이를 아래 명령문을 통해 RR/MM/DD의 형태로 변경해주면 된다.
Alter session set nls_date_format='RR/MM/DD';

좀 더 깊이 들어가서 년도 날짜 포맷인 RR과 YY의 차이점을 알아보자.
21세기 초반인 현재 일어나는 문제인데, 년도를 4자리가 아닌 2자리로 쓸때
88/01/22(본인 생일)은 YY 형식에서는 2088년으로 인식된다.
YY는 현재 세기 기준으로 날짜를 인식하고,
RR은 1988-2088년 중 현재와 가장 가까운 년도로 인식하기 때문이다.

위 nls_date_format(RR 또는 YY)과 상관없이 결과가 출력되도록 하려면
아래의 예제를 참고하도록 한다.

1981년 1월 ~ 12월 사이에 태어난 사람을 출력하는 코드
select ename, hiredate
from emp
where hiredate between to_date('1981/01/01', 'RRRR/MM/DD')
and to_date('1981/12/31', 'RRRR/MM/DD');

=================이 글은 Markdown을 활용해 작성하였습니다=================

반응형

'SQL' 카테고리의 다른 글

[SQL] 6. 그룹함수(복수행함수)  (0) 2018.01.23
[SQL] 5. 일반함수  (0) 2018.01.22
[SQL] 3. 문자함수 & 숫자함수  (0) 2018.01.20
[SQL] 2. 데이터 제한 및 정렬  (0) 2018.01.20
[SQL] 1. select 문을 사용하여 데이터 검색  (0) 2018.01.18
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함