SELECT SYSDATE "COL1" --2022-08-17 11:14:40
,SYSDATE+1 "COL2" --2022-08-18 11:14:40
,SYSDATE-2 "COL3" --2022-08-15 11:14:40
,SYSDATE+30 "COL4" --2022-09-16 11:14:40
FROM DUAL;
--2022-10-10 2022-10-11 2022-10-08 2022-11-09
--○시간 단위 연산
SELECT SYSDATE "COL1"
,SYSDATE + 1/24 "COL2"
,SYSDATE - 2/24 "COL3"
FROM DUAL;
--○현재 시간과 현재시간 기준 1일 2시간 3분 4초후를 조회
SELECT SYSDATE "현재시간"
,SYSDATE+1+2/24+3/(24*60)+4/(24*60*60) "이후"
FROM DUAL;
과 같이 해야한다.
TO_DATE()함수를 통해 문자 타입을 날짜 타입으로 변환을 수행하는 과정에서 내부적으로 해당 날짜에 대한 유효성 검사가 이루어진다.
ORA-01843: not a valid month (입력한 월이 잘못 되었을 경우)
날짜 타입은 ROUND와 TRUNC를 통해 반올림과 절삭이 가능하다.
--※날짜 데이터를 대상으로 반올림, 절삭 등의 연산을 수행할 수 있다.
--○날짜 반올림
SELECT SYSDATE "COL1" --기본 현재 날짜
,ROUND(SYSDATE, 'YEAR') "COL2" -- 2023-01-01연도까지 유효한 데이터(상반기/하반기 기준)
,ROUND(SYSDATE, 'MONTH') "COL3" -- 2022-09-01월까지 유효한 데이터(15일 기준)
,ROUND(SYSDATE, 'DD') "COL4" --2022-08-18일까지 유효한 데이터(정오 기준)
,ROUND(SYSDATE, 'DAY') "COL5" -- 2022-08-21일까지 유효한 데이터(수요일 정오기준)
FROM DUAL;
--2022-10-10 2023-01-01 2022-10-01 2022-10-11 2022-10-09
--○날짜 절삭
SELECT SYSDATE "COL1" --기본 현재 날짜
,TRUNC(SYSDATE, 'YEAR') "COL2" -- 2022-01-01연도까지 유효한 데이터
,TRUNC(SYSDATE, 'MONTH') "COL3" --2022-08-01 월까지 유효한 데이터
,TRUNC(SYSDATE, 'DD') "COL4" --2022-08-17일까지 유효한 데이터
,TRUNC(SYSDATE, 'DAY') "COL5" -- 2022-08-14그 전 주에 해당하는 일요일
FROM DUAL;
--2022-10-10 2022-01-01 2022-10-01 2022-10-10 2022-10-09
DATE에 관련된 함수들
SELECT SYSDATE "COL1"
,ADD_MONTHs(SYSDATE ,2) "COL2"
,ADD_MONTHs(SYSDATE ,3) "COL3"
,ADD_MONTHs(SYSDATE ,-2) "COL4"
,ADD_MONTHs(SYSDATE ,-3) "COL5"
FROM DUAL;
/*
2022-08-17 11:38:15
2022-10-17 11:38:15
2022-11-17 11:38:15
2022-06-17 11:38:15
2022-05-17 11:38:15
*/
--○MONTHS_BETWEEN()
--첫번째 인자값에서 두번째 인자값을 뺀 개월 수를 반환한다. -> 단위 : 개월 수
SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2002-05-31','YYYY-MM-DD')) "COL1"
FROM DUAL;
--242.564126344086021505376344086021505376
-->개월 수의 차이를 반환하는 함수
-- 결과값의 부호가 - 음수 로 반환되었을 경우에는
-- 첫 번째 인자값에 해당하는 날짜보다
-- 두 번째 인자값에 해당하는 날짜가 미래 라는 의미로 확인할 수 있다.
--○NEXT_DAY()
SELECT NEXT_DAY(SYSDATE,'토') "COL1"
,NEXT_DAY(SYSDATE,'월') "COL2"
FROM DUAL;
-->>2022-08-20 11:44:06
-- 2022-08-22 11:46:30
-- 다음일요일과 다음 월요일을 구하는것
-->
SELECT LAST_DAY(SYSDATE) "COL1"
, LAST_DAY(TO_DATE('2020-02-10','YYYY-MM-DD')) "COL2"
, LAST_DAY(TO_DATE('2019-02-10','YYYY-MM-DD')) "COL3"
FROM DUAL;
--○ 현재 시간을 기준으로 1년 2개월 3일 4시간 4분 6초 후를 조회한다.
-- TO_YMINTERVAL(), TO_DSINTERVAL()
-- 연월 일부터 초까지
SELECT SYSDATE "현재시간"
, SYSDATE + TO_YMINTERVAL('01-02') "연산결과"
, SYSDATE + TO_DSINTERVAL('003 04:05:06') "연산결과"
FROM DUAL;
--==>> 2023-10-17 17:47:49
-- 2022-08-20 21:52:55
-- 복무 기간은 22개월로 한다
-- 1. 전역 일자를 구한다.
-- 2. 하루 꼬박꼬박 3끼 식사를 한다고 가정하면
-- 태민이가 몇 끼를 먹어야 집에 보내줄까...
SELECT (ADD_MONTHS(SYSDATE,22)-SYSDATE)*3
FROM DUAL;
-- 『1일 2시간 3분 4초』를... 『초』로 환산하면...
SELECT (1일) + (2시간) + (3분) + (4초)
FROM DUAL;
SELECT (1*24*60*60) + (2*60*60) + (3*60) + (4)
FROM DUAL;
--==>>93784
-- 『93784』를... 다시 『일, 시간, 분, 초』로 환산하면...
SELECT TRUNC(TRUNC(TRUNC(93784/60)/60)/24)"일"
, MOD(TRUNC(TRUNC(93784/60)/60),24)"시간"
, MOD(TRUNC(93784/60),60) "분" --60으로 나누어지지 않은 것은 60분=1시간이 안되는 진짜 분을 의미할것!
, MOD(93784, 60) "초"
FROM DUAL;
--1 2 3 4
위를 통해 특정일까지 남은 시간을 구할 수 있다.
SELECT SYSDATE "현재"
,TO_DATE('2023-01-16 18:00:00','YYYY-MM-DD HH24:MI:SS') "수료일"
,TRUNC(TO_DATE('2023-01-16 18:00:00','YYYY-MM-DD HH24:MI:SS')-SYSDATE) "일"
,TRUNC(MOD((TO_DATE('2023-01-16 18:00:00','YYYY-MM-DD HH24:MI:SS')-SYSDATE)*24,24)) "시"
,TRUNC(MOD((TO_DATE('2023-01-16 18:00:00','YYYY-MM-DD HH24:MI:SS')-SYSDATE)*24*60,60)) "분"
,TRUNC(MOD((TO_DATE('2023-01-16 18:00:00','YYYY-MM-DD HH24:MI:SS')-SYSDATE)*24*60*60,60)) "초"
FROM DUAL;
--2022-10-10 2023-01-16 97 21 58 25
ALTER SESSION SET NLS_LANGUAGE = 'ENGLISH';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'ENGLISH';
ALTER SESSION SET NLS_CURRENCY = '$'; --₩ 표시
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--○날짜형 -> 문자형
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD') "COL1" --2022-08-17
,TO_CHAR(SYSDATE, 'YYYY') "COL2" --2022
,TO_CHAR(SYSDATE, 'YEAR') "COL3" --TWENTY TWENTY-TWO
,TO_CHAR(SYSDATE, 'MM') "COL4" --08
,TO_CHAR(SYSDATE, 'MONTH') "COL5" --AUGUST
,TO_CHAR(SYSDATE, 'MON') "COL6" --AUG
,TO_CHAR(SYSDATE, 'DD') "COL7" --17
,TO_CHAR(SYSDATE, 'MM-DD') "COL8" --08-17
,TO_CHAR(SYSDATE, 'DAY') "COL9" --WEDNESDAY
,TO_CHAR(SYSDATE, 'DY') "COL10" --WED
,TO_CHAR(SYSDATE, 'HH24') "COL11" --17
,TO_CHAR(SYSDATE, 'HH') "COL12" --05
,TO_CHAR(SYSDATE, 'HH AM') "COL13" --05 PM
,TO_CHAR(SYSDATE, 'HH PM') "COL14" --05 PM
,TO_CHAR(SYSDATE, 'MI') "COL15" --11
,TO_CHAR(SYSDATE, 'SS') "COL16" --46
,TO_CHAR(SYSDATE, 'SSSSS') "COL17" --61906 시간초
,TO_CHAR(SYSDATE, 'Q') "COL18" --3 분기
FROM DUAL;
--숫자형 -> 문자형
SELECT 7 "COL1"
,'7' "COL2"
,TO_CHAR(7) "COL3"
FROM DUAL;
-->조회결과의 정렬이 어떤지 확인
--숫자는 우측정렬
--문자는 좌측정렬
--○ TO_CHAR() 활용 → 형식 맞춤 표기 결과값 반환
SELECT 60000 "COL1"
, TO_CHAR(60000, '99,999') "COL2"
, TO_CHAR(60000, '$99,999') "COL3"
, TO_CHAR(60000, 'L99,999') "COL4"
, LTRIM(TO_CHAR(60000, 'L99,999')) "COL5"
FROM DUAL;
--==>> 60000 60,000 $60,000 ₩60,000 ₩60,000
--○문자형 -> 숫자형
SELECT TO_NUMBER('4') "COL1"
,'4' "COL2"
,4 "COL3"
,TO_NUMBER('04') "COL4" --숫자로 변환되며 0이 탈락되어 4
FROM DUAL;
--4 4 4 4
--조회 결과가 우측 정렬
--○현재 날짜에서 현재 년도(2022)를 숫자 형태로 조회(반환)
SELECT TO_NUMBER(TO_CHAR(SYSDATE,'YYYY')) "연도(숫자형)"
FROM DUAL;
--조회결과 우측정렬로 숫자형 확인
--○EXTRACT()
SELECT TO_CHAR(SYSDATE, 'YYYY') "COL1" --2022 ->연도를 추출하여 문자 타입으로..
,TO_CHAR(SYSDATE,'MM') "COL2" --08 -> 월을 추출하여 문자 타입으로...
,TO_CHAR(SYSDATE,'DD') "COL3" --17 -> 일을 추출하여 문자 타입으로..
,EXTRACT(YEAR FROM SYSDATE) "COL4" --2022(숫자형) -> 연도를 추출하여 숫자 타입으로
,EXTRACT(MONTH FROM SYSDATE) "COL5" --8(숫자형) -> 월을 추출하여 숫자 타입으로
,EXTRACT(DAY FROM SYSDATE) "COL6" --17 -> 일을 추출해서 숫자 타입으로..
FROM DUAL;
-->년,월,일 이외의 다른 항목은 불가~!!