변환함수 (데이터 유형을 변환하는 함수 )
데이터 유형 : 문자형, 숫자형, 날짜형
- to_char : 문자형으로 변환하는 함수
- to_number : 숫자형으로 변환하는 함수
- to_date : 날짜형으로 변환하는 함수
날짜를 문자로 출력할때 사용할 수 있는 날짜 포맷
RRRR, YYYY : 년도 4자리
RR, YY : 년도 2자리
MM, MON : 달
DD : 일
DAY, DY, D : 요일
WW, IW : 주
HH, HH24 : 시간
MI : 분
SS : 초
RR 과 YY 의 차이점
RR
1981
현재 연도에서 가장 가까운 연도로 인식
YY
2081
현재 세기로 인식
—>2050 년 이되면 ? ㅋㅋㅋ 오라클에서 해결방법을 준다고함 !
오라클 날짜 형식을 살펴보면
대부분 한국에서는 RR/MM/DD 로 되어있다.
만약 날짜 형식 변경하고 싶다면
alter session set pls_date_format = 'YY/MM/DD' ;
하게 되면 변경 된다.
날짜형 —> 문자형으로 변환함수 (to_char)
오늘이 무슨 요일인지 출력하시오
select to_char(sysdate , 'day')
from dual;
예제 : emp14 테이블에서 내가 무슨 요일에 태어났는지
select to_char(birth ,'day')
from emp14
where ename = '이름 '
-> 무슨요일을 출력해야하므로 select 절에 요일을 나타내는 문장을 작성한다.
그리고 누구를 검색할건지 where 절에 기술한다.
문제 : emp14 테이블에서 수요일에 태어난 학생들 이름, 생일 출력
select ename, birth
from emp14
where to_char(birth, 'day') = '수요일' ;
-> 문제의 조건이 수요일에 태어난것이므로 where 절에 검색조건을 기술한다.
문제 : 이름과, 입사일, 입사한 년도를 (4자리로 )를 출력
select ename, hire date, to_char(hiredate, 'RRRR')
from emp;
응용문제 : 이름, 생일, 태어난 요일, 월화수목금토일 순으로 정렬하여 출력
select ename, birth , to_char(birth, 'day'), replace(to_char(birth, 'd'), 1, 8)
from emp14
order by 4 asc;
설명 : d 가 날짜가 숫자로 나오기 때문에 replace 하기전 날짜별 숫자들을 보면 일요일부터 1 번으로 시작한다.
일, 월, 화 순으로 가기 때문에 일요일 날짜를 제일 끝번인 8 번으로 대체 해 준뒤
order by 절로 asc 하게 출력 할 수 있다.
문제 : 월급이 1000 에서 4000 사이인 사원들의 이름과 월급과, 입사일과 입사한 년도를 4자리로 출력하는데 , 입사한 년도를 asc 하게 출력 하고, 컬럼명을 한글로 이름, 월급, 입사일, 입사년도로 출력되게 하시오
select ename as 사원이름, sal 사원월급, hiredate 사원입사일 , to_char(hiredate, 'RRRR') 입사년도
from emp
where sal between 1000 and 4000
order by 3 asc;
월급에 ',' 를 붙여서 출력하는 방법
날짜에서 년도, 달, 일, 요일을 추출하려면 TO_CHAR 를 이용하여 날짜를 문자로 명시적 형변환을 해주어야 합니다.
예제 이름과, 입사요일, 월급을 추출( 월급에 천단위를 부여할것 )
select ename, to_char(hiredate, 'day'), to_char(sal, '999,999')
from emp;
설명 : 9의 의미는 자릿수를 의미하고, 9자리에 무엇이 와도 관계가 없다( 0~9 )는 의미이다.
문제 : 이름과, 보너스를 출력 보너스가 월급 * 1000000000으로 하고 천단위와 백만단위등을 표시되게 하시오
select ename, to_char(sal * 1000000000, '999,999,999,999,999')
from emp;
- 금융권에서 필수적으로 사용하는 sql 식
문제 : 위의 문제 결과를 다시 출력하는데 뒤의 0 세개를 절삭하고 출력하시오
(1)
select ename, rtrim (to_char (sal * 1000000000, '999,999,999,999,999') , '0') as 보너스
from emp;
(2)
select ename, substr(to_char (sal * 1000000000, '999,999,999,999,999') , 1, 17) as 보너스
from emp;
(3)
select ename, rtrim(trunk(to_char(sal * 1000000000,-3), '999,999,999,999,999') , '0' )as 보너스
from emp;
생각해서 유지보수가 편한걸로 sql 로 짜야한다. ( sql 을 자주 변경하지 않아도 결과가 잘 출력 될 수 있도록 )
입사년도를 4자리로 출력하는 경우
select ename, to_char(컬럼명, 'RRRR')
from emp
TO_CHAR 의 날짜포멧의 WW, IW 란?
→ 오늘이 올해의 몇번째 주 이냐 ?
select to_char(to_date('2021/01/08','RRRR/MM/DD'), 'ww')
from dual;
→ 둘이 똑같이 2021/01/04 년인데 왜 주가 다르게 나오는 이유?
WW : 무조건 1일부터 7일씩 끊어서 한주를 나타낸다.
IW : 실제 달력에 맞게 주차가 계산 (월요일부터시작). 달력상에 새로운 한주가 시작되는 월요일부터 한주씩 카운트된다.
'Oracle > SQL' 카테고리의 다른 글
SQL 단일행 함수 -변환함수 (to_number) , 암시적 형 변환 (0) | 2021.11.19 |
---|---|
SQL 단일행 함수 -변환함수 (To_date) 날짜형으로 변환 (0) | 2021.11.19 |
SQL 단일행 함수 - 날짜함수 (0) | 2021.11.19 |
SQL 단일행 함수 - 숫자함수 (Round, Trunc, Mod)반올림, 숫자버리기, 나누기 (0) | 2021.11.19 |
SQL 단일행 함수 - 문자함수 (Trim, Rtrim, Ltrim) 문자잘라내기 (0) | 2021.11.19 |