Programing

시간대 정보로 MySQL에 datetime을 저장하는 방법

crosscheck 2020. 12. 13. 08:58
반응형

시간대 정보로 MySQL에 datetime을 저장하는 방법


탄자니아에서 찍은 수천 장의 사진이 있고 각 사진을 찍은 날짜와 시간을 MySQL 데이터베이스에 저장하고 싶습니다. 그러나 서버는 미국에 있으며 봄 일광 절약 시간 (미국) 동안 "유효하지 않은"시간에 해당하는 탄자니아 날짜-시간을 저장하려고하면 문제가 발생합니다. 탄자니아는 DST를하지 않으므로 시간은 실제로 유효한 시간입니다.

추가적인 문제는 데이터베이스에 저장된 날짜-시간 값에 액세스해야하는 다양한 시간대의 공동 작업자가 있다는 것입니다. 저는 그들이 항상 다양한 협력자가있는 현지 시간이 아닌 탄자니아 시간으로 나오기를 바랍니다.

누군가 세션 시간을 설정하는 것을 잊고 시간을 잘못 설정하면 문제가 발생할 수 있다는 것을 알고 있기 때문에 세션 시간 설정을 꺼립니다. 그리고 나는 서버에 대한 어떤 것도 변경할 권한이 없습니다.

필자는 다음을 읽었습니다. 일광 절약 시간 및 시간대 모범 사례MySQL 날짜 시간 필드 및 일광 절약 시간- "추가"시간을 어떻게 참조합니까? 그리고 PHP에서 UTC로 날짜를 저장 / MySQL을

그러나 그들 중 어느 것도 내 특정 문제를 해결하지 못하는 것 같습니다. 저는 SQL 전문가가 아닙니다. DATETIME을 설정할 때 시간대를 지정하는 방법이 있습니까? 본 적이 없습니다. 그렇지 않으면이 문제에 접근하는 방법에 대한 제안을 대단히 감사합니다.

편집 : 여기에 내가 겪고있는 문제의 예가 있습니다. 명령을 보냅니다.

INSERT INTO Images (CaptureEvent, SequenceNum, PathFilename, TimestampJPG) 
VALUES (122,1,"S2/B04/B04_R1/IMAG0148.JPG","2011-03-13 02:49:10")

그리고 오류가 발생합니다.

Error 1292: Incorrect datetime value: '2011-03-13 02:49:10' for column 'TimestampJPG'

이 날짜와 시간은 탄자니아에 있지만 데이터베이스가있는 미국에는 없습니다.


당신은 말했다 :

저는 그들이 항상 다양한 협력자가있는 현지 시간이 아닌 탄자니아 시간으로 나오기를 바랍니다.

이 경우 UTC를 사용 하지 마십시오. 여러분이해야 할 일은 DATETIME타입 대신 MySQL 타입 을 사용하는 것입니다 TIMESTAMP.

MySQL 문서에서 :

MySQL TIMESTAMP은 현재 시간대의 값을 저장을 위해 UTC 로 변환 하고 검색을 위해 UTC에서 현재 시간대로 다시 변환 합니다. (와 같은 다른 유형에서는 발생하지 않습니다 DATETIME.)

이미DATETIME 유형을 사용하고있는 경우 시작하려면 현지 시간으로 설정하지 않아야합니다. 여기서는 다루지 않은 데이터베이스보다는 애플리케이션 코드에 더 집중해야합니다. 문제와 해결책은 언어에 따라 크게 다르므로 응용 프로그램 코드의 적절한 언어로 질문에 태그를 지정해야합니다.


설명하는 모든 증상은 MySQL에 사용할 시간대를 절대 알려주지 않으므로 기본적으로 시스템 영역이됩니다. 그것에 대해 생각해보십시오. 만약 그것이 전부 '2011-03-13 02:49:10'라면 그것이 현지 탄자니아 데이트라고 어떻게 추측 할 수 있습니까?

내가 아는 한, MySQL은 날짜에 시간대 정보를 지정하는 구문을 제공하지 않습니다. 연결별로 변경해야 합니다 . 같은 것 :

SET time_zone = 'EAT';

이것이 작동하지 않는 경우 (명명 된 영역을 사용 하려면 서버가 그렇게 구성 되어 있어야하며 그렇지 않은 경우가 많음) 간단히 UTC 오프셋을 사용할 수 있습니다.

SET time_zone = '+03:00';

MySQL은 시간대 정보 없이 DATETIME 저장 합니다. DATETIME 필드에 '2019-01-01 20:00:00'을 저장한다고 가정 해 보겠습니다.이 값을 검색하면 해당 값이 속한 시간대 를 알 수 있습니다.

따라서 귀하의 경우 DATETIME 필드에 값을 저장할 때 탄자니아 시간인지 확인하십시오. 그럼 당신이 그것을 꺼내면 탄자니아 시간이 될 것입니다. 예이!

이제 털이 많은 질문은 다음과 같습니다. INSERT / UPDATE를 수행 할 때 값이 탄자니아 시간인지 어떻게 확인합니까? 두 가지 경우 :

  1. 당신은 INSERT INTO table (dateCreated) VALUES (CURRENT_TIMESTAMP or NOW())합니다.

  2. 을 수행 INSERT INTO table (dateCreated) VALUES (?)하고 애플리케이션 코드에서 현재 시간을 지정합니다.

사례 # 1

MySQL은 현재 시간을 취합니다. '2019-01-01 20:00:00'탄자니아 시간이라고 가정 해 보겠습니다. 그런 다음 MySQL 은이 를 UTC로 변환 하여 '2019-01-01 17:00:00'으로 나오고 해당 값을 필드에 저장 합니다.

그렇다면 '20 : 00 : 00 '인 탄자니아 시간을 현장에 저장하려면 어떻게해야합니까? 불가능합니다. 이 필드에서 읽을 때 코드는 UTC 시간을 예상해야합니다.

사례 # 2

전달하는 값의 유형에 따라 다릅니다 ?. '2019-01-01 20:00:00'문자열을 전달하면 유용합니다. 이것이 바로 DB에 저장되는 것입니다. 어떤 종류의 Date 객체를 전달 하면 db 드라이버가 해당 Date 객체를 해석하는 방법 과 궁극적으로 저장을 위해 MySQL에 제공하는 'YYYY-MM-DD HH : mm : ss'문자열이 무엇인지 에 따라 달라집니다 . db 드라이버의 설명서를 참조하십시오.


나는 또한 다른 공동 작업자가 사용하는 데이터를 저장 해야하는 그런 문제에 직면했으며 1970 년 1 월 이후의 초 수를 나타내는 유닉스 타임 스탬프 형식으로 시간을 저장하는 정수 형식입니다. 탄자니아의 오늘 날짜와 시간의 예 Friday, September 13, 2019 9:44:01 PM는 유닉스 타임 스탬프에 저장 될 때입니다.1568400241

이제 데이터를 읽을 때 php 또는 다른 언어와 같은 것을 사용하고 유닉스 타임 스탬프에서 날짜를 추출하십시오. PHP의 예는 다음과 같습니다.

echo date('m/d/Y', 1568400241);

이렇게하면 다른 위치에있는 다른 공동 작업자와 함께 데이터를 더 쉽게 저장할 수 있습니다. 그들은 단순히 자신의 gmt 오프셋을 사용하여 날짜를 유닉스 타임 스탬프로 변환하고 정수 형식으로 저장할 수 있으며 이것을 출력 할 때 간단히

참고 URL : https://stackoverflow.com/questions/19843203/how-to-store-a-datetime-in-mysql-with-timezone-info

반응형