수색…


비고

MySQL의 전세계 사용자에 대한 시간 정보를 처리해야하는 경우 테이블에 TIMESTAMP 데이터 유형을 사용하십시오.

각 사용자마다 사용자 기본 설정 시간대 열을 저장하십시오. VARCHAR (64)는 해당 C 럼에 적합한 데이터 유형입니다. 사용자가 시스템을 등록하도록 등록하면 표준 시간대 값을 요청하십시오. 내 것은 대서양 시대, America/Edmonton . 귀하는 Asia/Kolkata 또는 Australia/NSW 일 수도 있고 아닐 수도 있습니다. 이 사용자 기본 설정에 대한 사용자 인터페이스의 경우 WordPress.org 소프트웨어가 좋은 예입니다.

마지막으로, 사용자 대신 호스트 프로그램 (Java, PHP 등)에서 DBMS 로의 연결을 설정할 때마다 SQL 명령을 실행하십시오

 SET SESSION time_zone='(whatever tz string the user gave you)'

시간과 관련된 사용자 데이터를 처리하기 전에 그러면 설치 한 모든 TIMESTAMP 시간이 사용자의 현지 시간으로 렌더링됩니다.

그러면 테이블에 들어가는 모든 시간이 UTC로 변환되고 모든 시간이 로컬로 변환됩니다. 그것은 NOW ()와 CURDATE ()에서 올바르게 작동합니다. 다시 말하면, DATETIME 또는 DATE 데이터 유형이 아닌 TIMESTAMP를 사용해야합니다.

서버 OS 및 기본 MySQL 시간대가 UTC로 설정되어 있는지 확인하십시오. 정보를 데이터베이스에로드하기 전에이 작업을 수행하지 않으면 수정이 거의 불가능합니다. 공급 업체를 사용하여 MySQL을 실행하는 경우,이 권리를 주장하십시오.

특정 시간대의 현재 날짜 및 시간을 검색합니다.

그러면 현지 시간, 인도 표준시, 다시 UTC로 NOW() 값을 가져옵니다.

SELECT NOW();
SET time_zone='Asia/Kolkata'; 
SELECT NOW();
SET time_zone='UTC'; 
SELECT NOW();

저장된 'DATE'또는 'DATETIME'값을 다른 시간대로 변환하십시오.

저장된 DATE 또는 DATETIME (어딘가에있는 열)이 있으면 일부 시간대와 관련하여 저장되었지만 MySQL에서는 시간대가 값과 함께 저장 되지 않습니다 . 따라서 다른 시간대로 변환하려는 경우 원래 시간대를 알아야합니다. CONVERT_TZ() 사용하면 변환이 수행됩니다. 이 예제는 현지 시간으로 캘리포니아에서 판매 된 행을 보여줍니다.

SELECT CONVERT_TZ(date_sold,'UTC','America/Los_Angeles') date_sold_local
  FROM sales
 WHERE state_sold = 'CA'

특정 시간대에 저장된 'TIMESTAMP` 값 검색

이것은 정말 쉽습니다. 모든 TIMESTAMP 값은 표준시로 저장되며 항상 렌더링 될 때마다 현재 time_zone 설정으로 변환됩니다.

SET SESSION time_zone='America/Los_Angeles'; 
SELECT timestamp_sold
  FROM sales
 WHERE state_sold = 'CA'

왜 이런거야? TIMESTAMP 값은 유서 깊은 UNIX time_t 데이터 유형을 기반으로합니다. 이러한 UNIX 시간 소인은 1970-01-01 00:00:00 UTC 이후의 초 단위로 저장됩니다.

알림 TIMESTAMP 값은 표준시로 저장됩니다. DATEDATETIME 값은 저장 될 때 적용된 현지 시간에 저장됩니다.

내 서버의 현지 시간대 설정이란 무엇입니까?

각 서버에는 서버 시스템의 소유자가 구성한 기본 글로벌 time_zone 설정이 있습니다. 다음과 같이 현재 시간대 설정을 확인할 수 있습니다.

SELECT @@time_zone

유감스럽게도, 보통 MySQL SYSTEM 시간은 서버 OS의 시간대 설정에 의해 결정됩니다.

이 일련의 쿼리 (예, 해킹 )는 서버의 시간대 설정과 UTC 간의 오프셋을 분 단위로 되돌려줍니다.

CREATE TEMPORARY TABLE times (dt DATETIME, ts TIMESTAMP);
SET time_zone = 'UTC';
INSERT INTO times VALUES(NOW(), NOW());
SET time_zone = 'SYSTEM';
SELECT dt, ts, TIMESTAMPDIFF(MINUTE, dt, ts)offset FROM times;
DROP TEMPORARY TABLE times;

이게 어떻게 작동합니까? 다른 데이터 유형을 가진 임시 테이블의 두 열이 단서입니다. DATETIME 데이터 유형은 항상 로컬 시간에 테이블에 저장되고 TIMESTAMP 는 UTC로 저장됩니다. 따라서 time_zone이 UTC로 설정된 경우 수행되는 INSERT 문은 두 개의 동일한 날짜 / 시간 값을 저장합니다.

그런 다음 SELECT 문은 time_zone이 server local time으로 설정된 경우 완료됩니다. TIMESTAMP 는 항상 저장된 UTC 형식에서 SELECT 문에서 현지 시간으로 변환됩니다. DATETIME 은 그렇지 않습니다. 따라서 TIMESTAMPDIFF(MINUTE...) 연산 은 로컬 시간과 범용 시간의 차이를 계산합니다.

내 서버에서 사용할 수있는 time_zone 값은 무엇입니까?

MySQL 서버 인스턴스에서 가능한 time_zone 값 목록을 얻으려면이 명령을 사용하십시오.

 SELECT mysql.time_zone_name.name

일반적으로 Paul Eggert가 Internet Assigned Numbers Authority 에서 관리하는 시간대ZoneInfo 목록을 보여줍니다. 전 세계적으로 약 600 개의 시간대가 있습니다.

유닉스와 같은 운영체제 (예 : 리눅스 배포판, BSD 배포판, 현대의 맥 OS 배포판)는 일상적인 업데이트를 받는다. 운영 체제에 이러한 업데이트를 설치하면 거기에서 실행되는 MySQL 인스턴스가 표준 시간대 및 일광 / 표준 시간 변경의 변경 사항을 추적 할 수 있습니다.

훨씬 짧은 시간대 이름 목록이 있으면 서버가 불완전하게 구성되었거나 Windows에서 실행 중입니다. 다음은 서버 관리자가 ZoneInfo 목록을 설치하고 유지 관리하기위한 지침 입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow