[SQL] 다른 시간대에서 데이터 관리

·2025년 6월 12일
0

SQL

목록 보기
17/126

TIME_ZONE 세션 파라미터

ALTER SESSION SET time_zone = '-5:00' ; 
ALTER SESSION SET TIME_ZONE = 'America/New_York';

CURRENT_DATE, CURRENT_TIMESTAMP 및 LOCALTIMESTAMP

SYSDATE: 서버가 위치하고 있는 곳의 날짜와 시간을 보여줌

만약 내가 있는 위치가 서버의 위치와 다르다면, CURRENT_DATE, CURRENT_TIMESTAMP 및 LOCALTIMESTAMP를 이용

  • CURRENT_DATE
    • 유저 세션의 현재 날짜 반환
    • DATE 데이터 유형
  • CURRENT_TIMESTAMP
    • 유저 세션의 현재 날짜와 시간 반환
    • TIMESTAMP WITH TIME ZONE 데이터 유형
  • LOCALTIMESTAMP
    • 유저 세션의 현재 날짜와 시간 반환
    • TIMESTAMP 데이터 유형
SELECT * 
FROM nls_session_parameters 
WHERE parameter LIKE '%FORMAT' ;

ALTER SESSION SET nls_date_format = 'YYYY/MM/DD HH24:MI:SS' ;
ALTER SESSION SET nls_timestamp_format = 'YYYY/MM/DD HH24:MI:SSXFF' ;
ALTER SESSION SET nls_timestamp_tz_format = 'YYYY/MM/DD HH24:MI:SSXFF TZR' ;

-- Asia/Seoul
SELECT sessiontimezone 
FROM dual ;

ALTER SESSION SET time_zone = '-5:00' ; 
ALTER SESSION SET TIME_ZONE = 'America/New_York';

-- America/New_York
SELECT sessiontimezone 
FROM dual ;

-- sysdate: 2025/06/12 22:13:11
-- systimestamp: 2025/06/12 22:13:11.096000000 +09:00
SELECT sysdate, systimestamp
  FROM dual ; 

-- current_date: 2025/06/12 09:13:59
-- current_timestamp: 2025/06/12 09:13:59.751000000 AMERICA/NEW_YORK
-- localtimestamp: 2025/06/12 09:13:59.751000000
SELECT current_date, current_timestamp, localtimestamp
  FROM dual ;

DBTIMEZONE 및 SESSIONTIMEZONE

  • 데이터베이스 시간대 값 표시
-- +00:00
SELECT DBTIMEZONE FROM DUAL;
  • 세션의 시간대 값 표시
-- -05:00
SELECT SESSIONTIMEZONE FROM DUAL;

TIMESTAMP 데이터 유형

데이터 유형필드
TIMESTAMP년, 월, 일, 시, 분, 초(소수 표시 초)
TIMESTAMP WITH TIME ZONETIMESTAMP 데이터 유형과 동일하며 TIMEZONE_HOUR 및 TIMEZONE_MINUTE 또는 TIMEZONE_REGION을 포함
TIMESTAMP WITH LOCAL TIME ZONETIMESTAMP 데이터 유형과 동일하며 값에 시간대 오프셋 포함

INTERVAL 데이터 유형

: 두 datetime값 간의 차이를 저장하는데 사용

  • 두 가지 간격 유형

    • year-month
    • Day-time
  • 간격의 자릿수

    • 간격을 구성하는 필드의 실제 부분 집합
    • 간격 수식자에 지정됨
데이터 유형필드
INTERVAL YEAR TO MONTH년, 월
INTERVAL DAY TO SECOND일, 시, 분, 초(소수 표시 초)
CREATE TABLE t1
( c1	DATE,
  c2	TIMESTAMP,
  c3	TIMESTAMP WITH TIME ZONE,
  c4	TIMESTAMP WITH LOCAL TIME ZONE,
  c5	INTERVAL YEAR TO MONTH,
  c6	INTERVAL DAY TO SECOND ) ; 

INSERT INTO t1 (c1,c2,c3,c4) 
VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,CURRENT_TIMESTAMP) ;

INSERT INTO t1 (c1,c2,c3,c4) 
VALUES (SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP) ;

SELECT * FROM t1 ;

-- 1-5: 1년 5개월
UPDATE t1 
SET c5 = '1-5', c6 = '5 15:11:10' ; 

SELECT * FROM t1 ;

-- 연산 가능
SELECT c1, c5, c6, c1 + c5, c1 + c6 
  FROM t1 ; 

EXTRACT 함수

날짜에서 특정 요소만을 뽑아낼 때 사용

  • 2007년 이후 고용된 모든 사원 표시
SELECT last_name, employee_id, hire_date
	FROM employees
    WHERE EXTRACT (YEAR FROM TO_DATE(hire_date, 'DD-MON-RR')) > 2007
    ORDER BY hire_date;
  • manager_id가 100인 사원에 대해 hire_date의 month 구성요소 표시
SELECT last_name, hire_date
		EXTRACT (MONTH FROM hire_date)
FROM employees
WHERE manager_id = 100;

YMINTERVAL 및 DSINTERVAL

YMINTERVAL: Year to Month
DSINTERVAL: Day to Second

-- SYSDATE: 2025/06/12 22:45:17
-- SYSDATE+TO_YMINTERVAL('1-2'): 2026/08/12 22:45:17
SELECT SYSDATE, SYSDATE + TO_YMINTERVAL ('1-2')
  FROM dual ; 

-- SYSDATE: 2025/06/12 22:50:34
-- SYSDATE+TO_DSINTERVAL('5 10:10:15'): 2025/06/18 09:00:49
SELECT SYSDATE, SYSDATE + TO_DSINTERVAL('5 10:10:15') 
  FROM dual ;

0개의 댓글