SELECT SYSDATE FROM DUAL;
-- 2024-07-10 04:16:56
SELECT SYSTIMESTAMP FROM DUAL;
-- 2024-07-10T04:16:56.597540+00:00
SELECT CURRENT_DATE FROM DUAL;
-- 2024-07-10 04:16:56
SELECT CURRENT_TIMESTAMP FROM DUAL;
-- 2024-07-10T04:16:56.597540+00:00
SELECT LOCALTIMESTAMP FROM DUAL;
-- 2024-07-10 04:16:56
이 다섯 가지 쿼리문은 모두 현재 날짜와 시간을 가져오지만 각각 날짜를 가져오는 기준과 용도가 조금씩 다르다.
SYSDATE : 'UTC' 기준으로 타임존 정보를 제외한 현재 날짜와 시간을 반환
SYSTIMESTAMP : 'UTC' 기준으로 타임존 정보를 포함한 현재 날짜와 시간(밀리터리초까지)을 반환
CURRENT_DATE : 세션의 시간대 기준으로 타임존 정보를 제외한 현재 날짜와 시간을 반환
CURRENT_TIMESTAMP : 세션의 시간대 기준으로 타임존 정보를 포함한 현재 날짜와 시간을 반환
LOCALTIMESTAMP : 세션의 시간대 기준으로 타임존 정보를 제외한 현재 날짜와 시간(밀리터리초까지)을 반환
다양하지만 로컬에서는 SYSDATE를 AWS에서는 CURRENT_DATE를 사용하면 된다.
하지만 다양한 상황에선 되던 것이 안 되고, 안 되던 것이 되는 것이 프로그래밍 영역인지라...
내가 경험했던 경우에 대한 해결책을 알려주려고 한다.
1. oracle cloud에서 생성한 DB에서의 SYSDATE
DB 세션을 로컬에 연결하여 사용할 때는 SYSDATE가 한국 기준으로 현재 날짜와 시간대가 잘 가져와진다. 하지만 oracle cloud 서비스를 통해 DB를 생성하고 해당 DB에 연결하여 쿼리문을 날려보면 SYSDATE는 UTC 기준으로 시간을 가져오는 것을 확인할 수 있다. 그럴 때는 ALTER SESSION SET TIME_ZONE = 'Asia/Seoul'; 이 쿼리문으로 해결 가능하다.
ALTER SESSION SET TIME_ZONE = 'Asia/Seoul';
-- 해당 세션의 TIME_ZONE을 변경하는 쿼리문
SELECT SESSIONTIMEZONE FROM DUAL;
-- Asia/Seoul
SELECT CURRENT_DATE FROM DUAL;
SELECT CURRENT_TIMESTAMP FROM DUAL;
SELECT LOCALTIMESTAMP FROM DUAL;
해당 쿼리문으로 TIME_ZONE을 변경한 뒤 SESSIONTIMEZONE을 조회하면 변경하고자 한 타임존이 조회되는 것을 확인할 수 있다. 그리고 변경한 이 타임존에 영향을 받는 녀석들이 CURRENT_DATE, CURRENT_TIMESTAMP, LOCALTIMESTAMP 이렇게 세 가지다.
타임존 정보를 저렇게 변경한 뒤에는 기존 SYSDATE 사용하던 것을 CURRENT_DATE로 사용하면 된다.
2. AWS EC2에서 생성한 인스턴스에서의 SYSDATE와 CURRENT_DATE
설명하기 전 참고로 나는 서버 배포하는 인스턴스는 AWS EC2에서 DB는 oracle cloud를 통해 생성하여 사용했다.
위에서 oracle cloud에서 생성한 DB의 세션 시간대의 타임존을 변경했지만 AWS EC2를 통해 서버를 배포한 뒤에도 여전히 SYSDATE, CURRENT_DATE 둘 다 UTC 기준으로 날짜와 시간을 가져오는 경우가 있을 수가 있다. 나 같은 경우도 분명 타임존 정보를 내가 원하는 'Asia/Seoul' 로 변경했는데 배포한 서버 상에서는 왜 여전히 UTC 기준으로 가져오는지 진짜 골치아팠다.
지금은 해답을 찾았지만 찾기 전까지는 결국 현재 날짜와 시간을 DB에서 구하는 것이 아닌 Java Script에서 Date 객체를 통해 얻고 그걸 자바로 전달해 DB로 이어 전달에 삽입하는 형식으로 굉장히 불편하게 이용을 했었다.
어쨌든 문제 원인은 AWS EC2에서 생성한 인스턴스 안에서도 시간대 설정을 해주어야 한다는 것이다.
내가 구글링하면서 도움 받은 링크 먼저 남겨놓는다.
https://velog.io/@bcl0206/AWS-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-Time-Zone-%ED%99%95%EC%9D%B8-%EB%B0%8F-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0
인스턴스를 연결하는 보이는 초기화면, 즉 [ec2-user@ip-000-00-00-000 ~] 해당 경로에서 아래코드를 입력한다.
sudo timedatectl set-timezone Asia/Seoul
타임존이 변경되었는지 확인하는 코드는
timedatectl
위 코드를 입력하면

자세한 시간 정보를 확인할 수 있다. 저기 Time zone을 보면 변경이 잘 되어있는 것을 확인할 수 있다.
이후 배포한 서버에서 SYSDATE와 CURRENT_DATE를 조회하면 SYSDATE는 여전히 UTC, CURRENT_DATE는 방금 변경한 타임존 기준으로 가져온 날짜와 시간을 확인할 수 있다.
해당 인스턴스에서 타임존 정보를 변경하기 전에는

이렇게 나오던 날짜와 시간이 변경 후에는

이렇게 변경되었다!
아직 많이 부족하기 때문에 내가 올린 방법들이 안 될 수도 있고, 틀린 정보일 수도 있다. 틀린 정보라면 언제든지 댓글을 통해 알려주셔도 감사할 따름이니 잘못된 정보가 있다면 지적해도 무방하다 ㅠㅠ
어쨌든! 나와 같은 문제로 고통 받고 있는 분들에게 도움이 되기를!!!