[컴] mysql 에서 db 의 timezone 과 다른 timezone 에서 요청하는 경우

 

mariadb / timezone 이슈 / db database

mysql 에서 db 의 timezone 과 다른 timezone 에서 요청하는 경우

만약 특정 일자가 ‘KST’ 로 Timestamp 값으로 저장되어 있는 경우, 이것을 ’영국’에서 누군가 조회를 하는 경우를 생각해보자.

+---------------+
| 서울(+09:00)  |   <--- 영국(00:00)
+---------------+

database 의 time_zone 사용

timezone 이 다른 경우 timezone 을 넣은 query 사용법

  • https://medium.com/@kenny_7143/timestamp-comparison-with-time-zone-in-mysql-6c8eadd8cf24
-- @@SESSION.time_zone 설정
SET time_zone='UTC';
SELECT * FROM time_test_2 WHERE log_time between '2020-03-12 13:30:00' AND '2020-03-12 14:30:00';

-- CONVERT_TZ 의 사용
SELECT CONVERT_TZ(log_time, @@SESSION.time_zone, 'UTC') AS log_time, log_message FROM time_test_2 WHERE log_time between CONVERT_TZ('2020-03-12 13:30:00', 'UTC', @@SESSION.time_zone) AND CONVERT_TZ('2020-03-12 14:30:00', 'UTC', @@SESSION.time_zone);

UNIX_TIMESTAMP

  • https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_unix-timestamp

를 보면, timestamp 에 대해서 저장된 값 그대로 return 해준다고 한다.

UNIX_TIMESTAMP([date]) … When the date argument is a TIMESTAMP column, UNIX_TIMESTAMP() returns the internal timestamp value directly, with no implicit “string-to-Unix-timestamp” conversion.

-- server 의 time_zone 은 UTC 라고 가정한다.
SELECT * FROM time_test_2 WHERE log_time between UNIT_TIMESTAMP('2020-03-12 13:30:00') AND UNIT_TIMESTAMP('2020-03-12 14:30:00');

기타

개인적으로 가장 명확한 방법은

  • client 에서 utc 로 보내게 하고,
  • server 에서는 무조건 utc 로 저장하고, 처리하는 것
  • client – 서버 사이에서는 timestamp 를 보내던지 아니면 ms 값으로 보내면 될 듯 하다.

댓글 없음:

댓글 쓰기