티스토리 뷰
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에는
- 문자형
- 숫자형
- 날짜형
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
- Data Analysis
- 빅데이터
- hadoop setup
- Big Data
- 하둡설치가이드
- 하둡
- hadoop install
- 데이터 분석
- data
- 하둡2.7
- 하둡설치
- hadoop
- hadoop2.7
- hadoop 2.7 install
- 하둡 설치 가이드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |