-- 숫자 -> 문자열 포맷방식이 숫자보다 길어야 한다
SELECT TO_CHAR(12345678, '$99,999,999,999.99') FROM DUAL; -- 결과 $12,345,678.00
SELECT TO_CHAR(1234) FROM DUAL; -- 1234 출력
SELECT TO_CHAR(1234, '99999') FROM DUAL; -- _1234 출력 (_은 빈칸을 대신하여 표현했다)
SELECT TO_CHAR(1234, '00000') FROM DUAL; -- 01234 출력
SELECT TO_CHAR(1234, 'L99999') FROM DUAL; -- _\1234 출력
SELECT TO_CHAR(1234, '$99999') FROM DUAL; -- _$1234 출력
SELECT TO_CHAR(1234, '00,000') FROM DUAL; -- 01,234 출력
SELECT TO_CHAR(1234, '999') FROM DUAL; -- 오류(원하는 값이 안나옴)
날짜 -> 문자열 , 문자열 -> 날짜
포맷문자
설명
YYYY , RRRR , YY , YEAR
년도표시 : 4자리 , Y2K , 2자리 , 영문
MM , MON , MONTH
월표시 : 2자리 , 영문3자리 , 영문전체
DD , DAY , DDTH
일표시 : 2자리 , 영문 , 2자리ST
AP , PM
오전 , 오후 표시
HH , HH24
시간표시 : 12시간 , 24시간
MI
분표시 : 0~59분
SS
초표시 : 0~59초
-- 날짜를 문자열로
SELECT TO_CHAR(SYSDATE, 'PM HH24:MI:SS') FROM DUAL; -- 오후 22:01:05
SELECT TO_CHAR(SYSDATE, 'AM HH:MI:SS') FROM DUAL; -- 오후 10:01:21
SELECT TO_CHAR(SYSDATE, 'MON DY, YYYY') FROM DUAL; -- 1월 수, 2022
SELECT TO_CHAR(SYSDATE, 'YYYY-fmMM-DD DAY') FROM DUAL; -- 2022-1-19 수요일
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD DAY') FROM DUAL; -- 2022-01-19 수요일
SELECT TO_CHAR(SYSDATE, 'YEAR, Q') || '분기' FROM DUAL; -- TWENTY TWENTY-TWO, 1분기
SELECT TO_CHAR(SYSDATE, 'YYYY"년" MM"월" DD"일"') FROM DUAL; -- 2022년 01월 19일
-----------------------------
년도 포맷 관련
-----------------------------
-- YYYY와 RRRR 차이는
-- RRRR은 50년 이상일때 1900으로 설정
-- 50년 미만일때 2000으로 설정 되지만
-- YYYY은 무조껀 2000으로 설정된다.
SELECT
TO_CHAR(SYSDATE, 'YYYY') -- 2022
, TO_CHAR(SYSDATE, 'RRRR') -- 2022
, TO_CHAR(SYSDATE, 'YY') -- 22
, TO_CHAR(SYSDATE, 'RR') -- 22
, TO_CHAR(SYSDATE, 'YEAR') -- TWENTY TWENTY-TWO
FROM DUAL;
------------------------------
월 포맷 관련
------------------------------
SELECT
TO_CHAR(SYSDATE, 'MM') -- 01
, TO_CHAR(SYSDATE, 'fmMM') -- 1
, TO_CHAR(SYSDATE, 'MONTH') -- 1월
, TO_CHAR(SYSDATE, 'MON') -- 1월
, TO_CHAR(SYSDATE, 'RM') -- 로마 숫자 1
FROM DUAL;
------------------------------
일 포맷 관련
------------------------------
-- DDD는 1월 1일 기준으로 현재까지의 날짜를 표기
-- DD는 달기준으로 현재까지
-- D는 주 기준으로 현재까지
SELECT
TO_CHAR(SYSDATE, '"1년 기준 " DDD"일 째"') -- 19
, TO_CHAR(SYSDATE, '"달 기준 " DD"일 째"') -- 19
, TO_CHAR(SYSDATE, '"주 기준 " D"일 째"') -- 4 (수요일)
FROM DUAL;
----------------------------
분기와 요일 포맷
----------------------------
SELECT
TO_CHAR(SYSDATE, 'Q"분기"') -- 1분기
, TO_CHAR(SYSDATE, 'DAY') -- 화요일
, TO_CHAR(SYSDATE, 'DY') -- 화
FROM DUAL;
-- 문자열을 날짜로
SELECT TO_DATE('2021-11-29') FROM DUAL; -- 21/11/29
-- 시분초까지 쓰면 포맷을 써줘야 한다
SELECT TO_DATE('2021-11-29 12:23:03', 'YYYY-MM-DD HH:MI:SS') FROM DUAL; --21/11/29
-- 문자열을 날짜로 2번째 방식
SELECT TO_TIMESTAMP('1994-01-01 12:23:25', 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; -- 94/01/01 12:23:25.000000000
WHERE 절에서 DATE 비교
날짜 비교 연산시 문자열은 날짜로 자동 형변환이 된다
날짜 비교 연산시 숫자는 날짜로 자동 형변환이 안된다.
SELECT
EMP_ID
, EMP_NAME
, HIRE_DATE
FROM EMPLOYEE
-- WHERE HIRE_DATE >= '20000101'; -- 자동 형변환 됨(문자열은 날짜로 자동 형변환 됨)
-- WHERE HIRE_DATE >= 20000101; -- 자동 형변환 안됨(숫자는 날짜로 자동 형변환 안됨)
WHERE HIRE_DATE >= TO_DATE(20000101, 'RRRRMMDD');
문자 -> 숫자
SELECT TO_NUMBER('123456789') FROM DUAL;
-- 자동형변환
SELECT '123' + '456' FROM DUAL;
----------------------------------
숫자 포맷
----------------------------------
-- 오류 숫자 중간에 ,가 있어 자동 형변환이 안된다.
SELECT '1,000,000' + '500,000' FROM DUAL;
-- 따라서 이와같이 작성해준다(참고로 ,는 출력되지 않는다)
SELECT
TO_NUMBER('1,000,000', '99,999,999') + TO_NUMBER('500,000', '999,999')
FROM DUAL;