본문 바로가기

SQL

[Oracle] 단일행 함수 - 형변환 함수

④ 형변환 함수

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이 수행됨

⇒ 조회 성능↓

Recent Posts
Popular Posts
Recent Comments