④ 형변환 함수
overloading : 함수이름은 같지만 인수값으로 어떤 자료형이 들어오느냐에 따라
프로그램은 다르게 수행하는 기능.
함수이름은 같지만 전혀 다른 함수들이다.
!!함수를 사용하여 변환하지 않아도 암시적으로 변환이 가능하지만, 명시적으로 함수 사용하자!!
to_number(문자숫자,’숫자모델요소’-생략가능) : 문자 → 숫자
to_date(문자날짜,’날짜모델요소’) : 문자날짜 → 날짜. 지역상관X
to_char(숫자값,’숫자모델요소’) : 숫자 → 문자
포멧
9 → 9자리 값이 없으면 표기X
999,999,999 → 23,000,000
0 → 0자리 값이 없으면 0으로 표기
000,000,000→ 023,000,000
-표현해야할 자리수가 안맞으면 #으로 출력된다.
, -> g
. -> d 으로
사용가능
$9999,999 : 달러로 표현
L9999,999 : 현재 세션에 맞는 지역의 통화부호를 표현
9999pr : 음수일경우 <> 묶음
9999mi : 음수기호(-)를 뒤에 표현
s9999 : 부호 표현
to_char(날짜값,’날짜모델요소’) : 날짜 → 문자
포멧
‘YYYY-MM-DD hh24:mi:ss’ : 표준형
포멧 안에 “” 사용하여 리터럴문자 표기 가능 ex) ‘q”분기”’
ddsp 영어 스펠링 ex) twenty-two
ddth ex) 22nd
ddspth 서수 단위 ex) tewnty-second
시간범위가 있는 데이터에서 21/01/01~21/12/31 검색 시
21/01/01 00:00:00부터 21/12/31 00:00:00까지 검색됨
해결1
where 컬럼명 >=to_date(’21/01/01’, ‘yyyy/mm/dd’)
and 컬럼명 <= to_date(’21/12/31 23:59:59’,’yyyy/mm/dd hh24:mi:ss’)
해결2
where 컬럼명 >= to_date(’21/01/01’,’yyyy/mm/dd’)
and 컬럼명< to_date(’22/01/01’,’yyyy/mm/dd’)
“YY” : 현재년도 세기를 반영. 95/01/01 -> 2095/01/01
“RR” : 2000년도 표기법을 자동화로 변경. 95/01/01 -> 1995/01/01
RR | 지정된 데이터 입력년도 | |
현재년도 | 0~49 | 50~99 |
0~49 | 반환 날짜는 현재 세기를 반영 | 반환 날짜는 이전 세기를 반영 |
50~99 | 반환 날짜는 이후 세기를 반영 | 반환 날짜는 현재 세기를 반영 |
"YY" 와 "RR" 비교
현재년도 | 데이터 입력 날짜 | YY | RR |
1994 | 95/10/27 | 1995 | 1995 |
1994 | 17/10/27 | 1917 | 2017 |
2001 | 17/10/27 | 2017 | 2017 |
2048 | 52/10/27 | 2052 | 1952 |
2051 | 47/10/27 | 2047 | 2147 |
[문제23] 사원들의 사원번호, 입사한 요일을 출력하세요. 단 요일을 오름차순 정렬해주세요.
select employee_id, to_char(hire_date,'day')
from employees
order by 2 ;
[문제24] employees(사원) 테이블에서 일요일에 입사한 사원의 정보를 조회하세요.
select *
from employees
where to_char(hire_date,'day')='일요일';
[문제25] 오늘 날짜를 "2021년 12월 21일 화요일" 출력해주세요.
select to_char(sysdate,'dl')
from dual;
[문제26] 사원의 employees(사원)테이블에 있는 last_name,hire_date 및 근무 6 개월 후 첫번째 월요일에 해당하는 급여 협상 날짜를 표시합니다. 열 레이블을 REVIEW 로 지정합니다. 날짜는 "월요일, the Second of 4, 2007"과 유사한 형식으로 나타나도록 지정합니다.
select last_name, to_char(hire_date,'day, "the" Ddspth "of" fmmm, yyyy'), --fm : 선행되는 0제거
next_day(add_months(hire_date,6),'월요일') "REVIEW"
from employees;
[문제27] 짝수달에 입사한 사원들의 정보를 출력해주세요.
select *
from employees
where mod(to_number(to_char(hire_date,'mm')),2)=0;
[문제28] 2006년도에 홀수달에 입사한 사원들의 정보를 출력해주세요.
select * from employees
where mod(to_number(to_char(hire_date,'MM')),2) = 1
and hire_date between '2006/01/01' and '2006/12/31';
and hire_date like ‘06%’;
like 연산자는 문자 패턴을 찾는 연산자이기 때문에 hire_date가 문자 컬럼이 아니면 암시적으로 형을 변환해서 수행함
⇒ 악성코드 가능성↑
and to_char(hire_date) = ’2006’;
만약 hire_date가 index가 생성되어 있는 컬럼일 경우 index scan이 아닌 테이블 full scan이 수행됨
⇒ 조회 성능↓
'SQL' 카테고리의 다른 글
[Oracle] 그룹함수 - group by절, having절 (0) | 2021.12.23 |
---|---|
[Oracle] 단일행 함수 - null 관련 함수, 조건제어문 (0) | 2021.12.22 |
[Oracle] 단일행 함수 - 날짜함수 (0) | 2021.12.22 |
[Oracle] 단일행 함수 - 숫자함수 (0) | 2021.12.22 |
[Oracle] 단일행 함수 - 문자함수 (0) | 2021.12.22 |