■ ROUND 함수에서 포맷 마스크를 사용해 날짜를 반올림하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SET SERVEROUTPUT ON; DECLARE V_SOURCE_DATE DATE := TO_DATE('2019-10-01 14:00:00', 'yyyy-mm-dd hh24:mi;ss'); V_TARGET_DATE DATE; BEGIN V_TARGET_DATE := ROUND(V_SOURCE_DATE, 'yyyy'); DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_TARGET_DATE, 'yyyy-mm-dd hh24:mi;ss')); -- 2020-01-01 00:00;00 END; |
■ TRUNC 함수에서 포맷 마스크를 사용해 날짜를 절삭하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SET SERVEROUTPUT ON; DECLARE V_SOURCE_DATE DATE := TO_DATE('2019-10-16 14:00:00', 'yyyy-mm-dd hh24:mi;ss'); V_TARGET_DATE DATE; BEGIN V_TARGET_DATE := TRUNC(V_SOURCE_DATE, 'mm'); DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_TARGET_DATE, 'yyyy-mm-dd hh24:mi;ss')); -- 2019-10-01 00:00;00 END; |
■ 특정일 해당 월 첫번째 날짜를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT ADD_MONTHS(LAST_DAY(SYSDATE), -1) + 1 FROM DUAL; |
■ LAST_DAY 함수를 사용해 해당 월의 마지막 날짜를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT LAST_DAY(TO_DATE('2019-11-02', 'yyyy-mm-dd')) FROM DUAL; |
■ FROM_TZ 함수를 사용해 시간대를 설정하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SET SERVEROUTPUT ON; DECLARE V_SOURCE_TIME TIMESTAMP := CAST('2019-11-02 21:27:00' AS TIMESTAMP); V_TARGET_TIME1 TIMESTAMP WITH TIME ZONE; V_TARGET_TIME2 TIMESTAMP WITH TIME ZONE; BEGIN V_TARGET_TIME1 := FROM_TZ(V_SOURCE_TIME, '-5:00' ); V_TARGET_TIME2 := FROM_TZ(V_SOURCE_TIME, 'US/EASTERN'); DBMS_OUTPUT.PUT_LINE(V_TARGET_TIME1); DBMS_OUTPUT.PUT_LINE(V_TARGET_TIME2); END; |
■ ADD_MONTHS 함수에서 2월 말일 추가 문제를 해결한 커스텀 함수를 사용하는 방법을 보여준다. ▶ 예제 코드 (SQL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
SET SERVEROUTPUT ON; DECLARE V_DATE DATE; FUNCTION AddMonth(P_SOURCE_DATE IN DATE, P_MONTH_COUNT IN NUMBER) RETURN DATE IS V_SOURCE_DAY NUMBER; V_TARGET_DATE DATE; V_TARGET_DAY NUMBER; BEGIN V_SOURCE_DAY := TO_NUMBER(TO_CHAR(P_SOURCE_DATE, 'DD')); V_TARGET_DATE := ADD_MONTHS(P_SOURCE_DATE, P_MONTH_COUNT); V_TARGET_DAY := TO_NUMBER(TO_CHAR(V_TARGET_DATE, 'DD')); IF V_TARGET_DAY > V_SOURCE_DAY THEN V_TARGET_DATE := V_TARGET_DATE - (V_TARGET_DAY - V_SOURCE_DAY); END IF; RETURN V_TARGET_DATE; END; BEGIN V_DATE := AddMonth(TO_DATE('2019-02-28', 'yyyy-mm-dd'), 1); DBMS_OUTPUT.PUT_LINE(V_DATE); END; |
■ V$TIMEZONE_NAMES 뷰를 사용해 시간대를 조회하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT TZNAME ,TZABBREV ,TZ_OFFSET(TZNAME) FROM V$TIMEZONE_NAMES; |
■ SESSIONTIMEZONE 키워드를 사용해 세션 시간대를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT SESSIONTIMEZONE FROM DUAL; -- Asia/Seoul |
■ DBTIMEZONE 키워드를 사용해 데이터베이스 시간대를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT DBTIMEZONE FROM DUAL; -- +00:00 |
■ 현재 날짜와 시간을 반환하는 키워드 데이터 타입을 비교한다. ▶ 비교표
|
────────────────────────── 키워드 시간대 데이터 타입 ───────── ─── ──────────── CURRENT_DATE 세션 DATE CURRENT_TIMESTAMP 세션 TIMESTAMP WITH TIME ZONE LOCALTIMESTAMP 세션 TIMESTAMP SYSDATE 서버 DATE SYSTIMESTAMP 서버 TIMESTAMP WITH TIME ZONE ────────────────────────── |
■ LOCALTIMESTAMP 키워드를 사용해 지역 현재 시간을 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT LOCALTIMESTAMP FROM DUAL; |
■ DSINTERVAL_UNCONSTRAINED 데이터 타입을 사용하는 방법을 보여준다. ▶ 예제 코드 (SQL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
SET SERVEROUTPUT ON; DECLARE V_INTERVAL INTERVAL DAY(9) TO SECOND(9); FUNCTION GetDoubleInterval(P_INTERVAL IN DSINTERVAL_UNCONSTRAINED) RETURN DSINTERVAL_UNCONSTRAINED IS BEGIN RETURN P_INTERVAL * 2; END; BEGIN V_INTERVAL := '100 0:0:0.123456789'; DBMS_OUTPUT.PUT_LINE(V_INTERVAL); DBMS_OUTPUT.PUT_LINE(GetDoubleInterval(V_INTERVAL)); END; |
■ TIMESTAMP 데이터 타입의 날짜간 기간을 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SET SERVEROUTPUT ON; DECLARE V_TIME1 TIMESTAMP; V_TIME2 TIMESTAMP; BEGIN V_TIME1 := TO_TIMESTAMP('1961-06-01 11:59', 'yyyy-mm-dd hh24:mi'); V_TIME2 := TO_TIMESTAMP('1961-11-15 12:01', 'yyyy-mm-dd hh24:mi'); DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_TIME1, 'yyyy-mm-dd hh24:mi')); -- 1961-06-01 11:59 DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_TIME2, 'yyyy-mm-dd hh24:mi')); -- 1961-11-15 12:01 DBMS_OUTPUT.PUT_LINE(V_TIME2 - V_TIME1); -- +000000167 00:02:00.000000000 END; |
■ DATE 데이터 타입의 날짜간 기간을 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SET SERVEROUTPUT ON; DECLARE V_TIME1 DATE; V_TIME2 DATE; BEGIN V_TIME1 := TO_DATE('1961-06-01 11:59', 'yyyy-mm-dd hh24:mi'); V_TIME2 := TO_DATE('1961-11-15 12:01', 'yyyy-mm-dd hh24:mi'); DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_TIME1, 'yyyy-mm-dd hh24:mi')); -- 1961-06-01 11:59 DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_TIME2, 'yyyy-mm-dd hh24:mi')); -- 1961-11-15 12:01 DBMS_OUTPUT.PUT_LINE(V_TIME2 - V_TIME1); -- 167.001388888888888888888888888888888889 END; |
■ CURRENT_DATE 키워드를 사용해 전일 날짜를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT CURRENT_DATE - INTERVAL '1' DAY FROM DUAL; SELECT CURRENT_DATE - 1 FROM DUAL; |
■ INTERVAL 데이터 타입을 사용해 날짜 연산을 하는 방법을 보여준다. ▶ 예제 코드 (SQL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
SET SERVEROUTPUT ON; DECLARE V_CREATE_TIME TIMESTAMP WITH TIME ZONE; V_INTERVAL1 INTERVAL YEAR TO MONTH; V_INTERVAL2 INTERVAL DAY TO SECOND; BEGIN V_CREATE_TIME := TIMESTAMP '2000-09-01 00:00:00 -5:00'; DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_CREATE_TIME, 'yyyy-mm-dd HH24:mi:ss.ff')); -- 2000-09-01 00:00:00.000000000 -- 년 수와 달 수를 더한다. V_INTERVAL1 := INTERVAL '01-06' YEAR TO MONTH; V_CREATE_TIME := V_CREATE_TIME + V_INTERVAL1; DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_CREATE_TIME, 'yyyy-mm-dd HH24:mi:ss.ff')); -- 2002-03-01 00:00:00.000000000 -- 일, 시간, 분, 초 수를 더한다. V_INTERVAL2 := INTERVAL '03 04:05:06.723112' DAY TO SECOND; V_CREATE_TIME := V_CREATE_TIME + V_INTERVAL2; DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_CREATE_TIME, 'yyyy-mm-dd HH24:mi:ss.ff')); -- 2002-03-04 04:05:06.723112000 END; |
■ INTERVAL ~ HOUR TO MINUTE 절을 사용하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT INTERVAL '01:01' HOUR TO MINUTE FROM DUAL; |
■ INTERVAL ~ YEAR TO MONTH 절을 사용하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT INTERVAL '10-11' YEAR TO MONTH FROM DUAL; |
■ NUMTODSINTERVAL 함수를 사용해 INTERVAL DAY TO SECOND 데이터 타입의 데이터를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT NUMTODSINTERVAL('100', 'MINUTE') FROM DUAL; -- +00 01:40:00.000000 |
■ TO_DSINTERVAL 함수를 사용해 INTERVAL DAY TO SECOND 데이터 타입의 데이터를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT TO_DSINTERVAL('+01 01:01:01.000000') FROM DUAL; -- +01 01:01:01.000000 |
■ NUMTOYMINTERVAL 함수를 사용해 INTERVAL YEAR TO MONTH 데이터 타입의 데이터를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT NUMTOYMINTERVAL(1, 'MONTH') FROM DUAL; -- +00-01 |
■ SYSTIMESTAMP 키워드를 사용해 시스템 현재 시간을 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT SYSTIMESTAMP FROM DUAL; -- 19/11/02 12:24:04.937000000 +09:00 |
■ TO_YMINTERVAL 함수를 사용해 INTERVAL YEAR TO MONTH 데이터 타입의 데이터를 구하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SELECT TO_YMINTERVAL('+10-11') FROM DUAL; |
■ EXTRACT 함수를 사용해 INTERVAL 데이터 타입의 데이터에서 특정 기간을 추출하는 방법을 보여준다. ▶ 예제 코드 (SQL)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
SET SERVEROUTPUT ON; DECLARE V_START_DATE DATE; V_END_DATE DATE; V_INTERVAL INTERVAL YEAR TO MONTH; V_YEAR_COUNT NUMBER; V_MONTH_COUNT NUMBER; BEGIN V_START_DATE := TO_DATE('2019-10-01', 'yyyy-mm-dd'); V_END_DATE := TO_DATE('2020-11-01', 'yyyy-mm-dd'); V_INTERVAL := (V_END_DATE - V_START_DATE) YEAR TO MONTH; V_YEAR_COUNT := EXTRACT(YEAR FROM V_INTERVAL); V_MONTH_COUNT := EXTRACT(MONTH FROM V_INTERVAL); DBMS_OUTPUT.PUT_LINE(V_INTERVAL ); -- +01-01 DBMS_OUTPUT.PUT_LINE(V_YEAR_COUNT ); -- 1 DBMS_OUTPUT.PUT_LINE(V_MONTH_COUNT); -- 1 END; |
■ INTERVAL 데이터 타입을 사용하는 방법을 보여준다. ▶ 예제 코드 (SQL)
|
SET SERVEROUTPUT ON; DECLARE V_START_DATE DATE; V_END_DATE DATE; V_INTERVAL INTERVAL YEAR TO MONTH; BEGIN V_START_DATE := TO_DATE('2019-10-01', 'yyyy-mm-dd'); V_END_DATE := TO_DATE('2020-11-01', 'yyyy-mm-dd'); V_INTERVAL := (V_END_DATE - V_START_DATE) YEAR TO MONTH; DBMS_OUTPUT.PUT_LINE(V_INTERVAL); -- +01-01 END; |