버글버글
DataBase 수업 기록(12) 함수 - 타입변환 본문
▶ DUAL 테이블
1. DUMMY 칼럼에 'X' 값을 하나 가지고 있는 테이블
2. 아무 의미 없는 테이블
3. 오라클에서는 FROM절이 필수이기 때문에,
테이블이 필요 없는 조회문에서 DUAL 테이블을 사용함
▶ 타입 변환 함수
1. 숫자로 변환
- TO_NUMBER('문자열') : 문자열 형식의 숫자를 숫자 형식으로 변환
SELECT '100', TO_NUMBER('100')
FROM DUAL;
-- '100'(문자열), 100(숫자열)
SELECT '1.5', TO_NUMBER('1.5')
FROM DUAL;
-- '1.5'(문자열), 1.5(숫자열)
* 숫자와 '문자' 연산은 오라클에 의해서 숫자와 숫자 연산으로 수정된 뒤 처리됨
'문자' → TO_NUMBER('문자') 방식으로 자동으로 처리함 |
SELECT 1 + '1' -- SELECT 1 + TO_NUMBER('1')
FROM DUAL;
-- 2
* '문자'와 '문자' 연산도 모두 숫자로 바꿔서 처리
SELECT '1' + '1' -- SELSECT TO_NUMBER('1') + TO_NUMBER('1')
FROM DUAL;
-- 2
예제) EMP_NO는 문자열 가장 성능이 낮은 조건은? (성능이 안좋은것은?)
① TO_NUMBER(EMP_NO) = 1
② EMP_NO = 1
③ EMP_NO = '1'
④ EMP_NO = TO_CHAR(1)
답 : ①
2. 문자로 변환
- TO_CHAR(데이터, ['형식']) : 지정된 데이터(주로 숫자나 날짜)를 형식에 맞는 문자열로 변환
1) 숫자 → 문자로 변환
SELECT
TO_CHAR(1234) -- '1234'
, TO_CHAR(1234, '999999') -- ' 1234' 공백 2칸
, TO_CHAR(1234, '000000') -- '001234' 0 2개
, TO_CHAR(1234, '9,999') -- '1,234'
, TO_CHAR(12345, '9,999') -- ###### (4자리로 지정하였으나 값은 5자리이기 떄문에 표지할 수 없음)
, TO_CHAR(12345, '99,999') -- '12,345'
, TO_CHAR(1.4, '9') -- '1' (형식은 정수 1자리 표기-소수 이하 반올림)
, TO_CHAR(1.5, '9') -- '2' (형식은 정수 1자리 표기-소수 이하 반올림)
, TO_CHAR(0.123, '0.00') -- '0.12', 소수 이하 2자리 표기(반올림)
, TO_CHAR(0.129, '0.00') -- '0.13', 소수 이하 2자리 표기(반올림)
FROM
DUAL;
2) 날짜 → 문자로 변환
- 현재 날짜와 시간
- DATE 타입의 SYSDATE
- TIMESTAMP 타입의 SYSTIMESTAMP
SELECT
SYSDATE -- 22/08/30
-- YY/MM/DD 형식으로 표시하지만 시간데이터도 가지고 있음
, SYSTIMESTAMP -- 22/08/30 11:12:37.671000000 +09:00
FROM DUAL;
SELECT
TO_CHAR(SYSDATE, 'YYYY-MM-DD') -- 2022-08-30
, TO_CHAR(SYSDATE, 'HH:MI:SS') -- 11:13:24
FROM DUAL;
3. 날짜로 변환
- TO_DATE('문자열', '형식') : 지정된 문자열을 날짜 형식으로 변환
- '05/06/07' 날짜는 언제인가? 알려주기 전에는 모른다. (2005년 06월 07일인지, 2007년 06월 05일인지?)
- 지정된 형식으로 해석
- 예시1) 'YY/MM/DD' : 05년 06월 07일
- 예시2) 'MM/DD/YY' : 07년 05월 06일
- 어떤 날짜를 어떻게 해석해야 하는지 알려주는 함수
SELECT
TO_DATE('05/06/07', 'YY/MM/DD') -- 05/06/07
, TO_DATE('05/06/07', 'MM/DD/YY') -- 07/05/06
FROM
DUAL;
- 현재 날짜를 YYYY-MM-DD 형식으로 조회 (TO DATE로 풀지 않게 조심하여라)
SELECT
TO_CHAR(SYSDATE, 'YYYY-MM-DD') -- 2022-08-30'
FROM DUAL;
예제) 사원 테이블에서 90/01/01 ~ 99/12/31 사이에 입사한 사원 조회하기
SELECT EMP_NO, NAME, DEPART, POSITION, GENDER, HIRE_DATE, SALARY
FROM EMPLOYEE
WHERE TO_DATE(HIRE_DATE, 'YY/MM/DD')
BETWEEN TO_DATE('90/01/01', 'YY/MM/DD') AND TO_DATE('31/12/99', 'DD/MM/YY');
* 실무에서는 날짜 타입을 NUMBER보단 VARCHAR2 타입으로 저장하는 경우가 많다.
( 이유는 성능이 좋기 때문 )
예시)
-- DT1, DT2, DT3 칼럼 생성
CREATE TABLE SAMPLE(
DT1 DATE,
DT2 TIMESTAMP,
DT3 VARCHAR2(10 BYTE)
);
-- DT1, DT2, DT3 칼럼에 현재 날짜 넣기
INSERT INTO
SAMPLE(DT1, DT2, DT3)
VALUES(SYSDATE, SYSTIMESTAMP, TO_CHAR(SYSDATE, 'YYYY-MM-DD'));
-- 조회
SELECT DT1,DT2,DT3 FROM SAMPLE;
-- 날짜 비교 연산은 TO_DATE 연산이 필요
-- 오늘 (당일) 날짜와 비교를 해야 함.
-- 1. 오류
SELECT DT1,DT2,DT3
FROM SAMPLE
WHERE DT1 = TO_DATE('22/08/26', 'YY/MM/DD');
-- 2. 오류
SELECT DT1,DT2,DT3
FROM SAMPLE
WHERE DT1 = '22/08/26';
-- 3. 성공
SELECT DT1,DT2,DT3
FROM SAMPLE
WHERE TO_DATE(DT1, 'YY/MM/DD') = TO_DATE('22/08/26', 'YY/MM/DD');
'Database > database 수업 기록' 카테고리의 다른 글
DataBase 수업 기록(14) 함수 - 수학 (0) | 2022.09.09 |
---|---|
DataBase 수업 기록(13) 함수 - NULL, 집계 (0) | 2022.09.08 |
DataBase 수업 기록(11) ROW (0) | 2022.09.06 |
DataBase 수업 기록(10.5) DQL 예시 (0) | 2022.09.05 |
DataBase 수업 기록(10) DQL (0) | 2022.09.04 |