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 값으로 보내면 될 듯 하다.
댓글 없음:
댓글 쓰기