2013-08-07 2 views
5

MySQL (InnoDB) DB에서 TIMESTAMP 필드를 INT로 변환해야합니다. TIMESTAMP를 INT로 변환하는 것이 이상한 일임을 알고 있지만 여전히해야합니다. :)TIMESTAMP를 INTEGER로 변환하는 MySQL - 시간대

시간이 많이 걸릴 것으로 보이지만 일부 시간대 및 일광 절약 시간 오류가 있습니다.

난 열 당 내 SQL 코드를 생성하는 스크립트가 있습니다. 예를 들어, 생성

ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED; 
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started); 
ALTER TABLE alarmLog DROP started; 
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0; 

내가 전에, 결과가 좋아 보인다 select FROM_UNIXTIME(1291788036);를 사용하여 데이터 후 비교합니다.

그런 다음 모든 클라이언트 측 소프트웨어를 UTC로 변환하고이를 저장할 때 해당 INT를 사용하도록 변경하는 것이 좋습니다. 검색 할 때 해당 INT는 현재 시간대로 변환됩니다. 이 시나리오에 대한

그러나 워드 프로세서 warn me (CET에서 일광 절약) :

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 02:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 03:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

방법 API 및 OS의 보통 일광 절약 처리합니까? 내 PC는 시계가 UTC로, 여름 시간에 OS가 2 시간, 겨울 시간이 1 시간이라는 것을 알고 있습니다. 나는 그것이 DST인지 여부를 결정하기 위해 UTC 시간을 사용한다고 가정합니다.

그럼 어떻게 처리해야합니까? DST 오프셋을 지정하기 위해 데이터베이스에 필드를 추가하는 유일한 솔루션입니까?

+1

서머 타임이 다른 시간대입니다. 예 : CET는 중부 유럽 표준시이며 CEST는 중부 유럽 서머 타임입니다. 운영 체제는 전환시기를 알고 있습니다. 시간 소인에 UTC를 사용하는 한 로컬 시간으로 변환하는 것은 프리젠 테이션 계층에 달려 있습니다. –

답변

3

INT에 시간을 저장할 필요가 없습니다. MySQL의 TIMESTAMP 유형은 어쨌든 (표준 유닉스 타임 스탬프를 사용하여 시간을 저장합니다) 항상 UTC입니다.

세션 시간대를 설정하기 만하면 모든 TIMESTAMP 열이 업데이트/선택시 해당 영역에서 /로 변환됩니다.

한 번 연결/초기화시 영역으로 설정할 수 있습니다

SET time_zone = '+10:00'; 

을 그리고 당신은 직접

SELECT timesamp_column FROM table ... 

내가 잘 알고 아니에요/선택하여 영역에 시간을 업데이트 할 수 있습니다 날짜 시간 libs하지만 그들은 시간대 및 일광 절약 시간제 오프셋을 확인하려면 문제의 시간을 제공 한 시간대를 사용하는 것 같아요.

제공된 예제에서는 시계가 01:59:59에서 03:00:00으로 이동하고 02:00:00이 실제로 발생한 적이 없기 때문에 값 중 하나가 실제로 유효하지 않다고 생각합니다. UNIX_TIMESTAMP 함수는이 경우 가장 가까운 초를 리턴합니다.

+0

타임 스탬프를 사용할 수는 있지만 그 유형은 사용할 수 없다는 것을 알고 있습니다. 클라이언트 측은 sqlite와 호환되어야하므로 INT 로의 변환이 필요합니다. 그리고 무효 시간에 대해서; 일광 절약 시간이 끝나면 하루에 두 번씩 특정 시간을 절약 할 수 있습니다. – Halfgaar

+0

동일한 문자열 표현으로 여러 시점이 있고 간격도 있습니다. 당신이 할 수있는 일이 없다고 생각합니다. Unix 타임 스탬프 (INT)로 값을 저장하고 MySQL의 함수 또는 시간 라이브러리 클라이언트 측에서 로컬 시간으로 변환하십시오. 시간대를 올바르게 설정하면 제대로 표시되어야합니다. – Vatev

+0

TIMESTAMP 컬럼에 '2005-03-27 02:00:00'삽입을 테스트했습니다. 그것을 가져 오는 것은 또한 '2005-03-27 03:00:00'을 제공하므로 괜찮다고 생각합니다. – Halfgaar

관련 문제