2009-11-30 4 views
1

(MSSQL) 데이터베이스 테이블의 데이터베이스 열을 UNIX time_t로 변환해야합니다. 문제는이 열에는 시간대가없고 일부 날짜는 GMT (+0000)이고 일부는 BST (+0100)입니다. 나는 영국 시간에 일하고있다.unzoned datetime을 UNIX time_t로 변환하는 신뢰할 수있는 방법이 있습니까?

unzoned datetime을 UNIX time_t로 변환하는 신뢰할 수있는 방법이 있습니까? 나는 현재

SELECT *,DATEDIFF(second,'1970-01-01',event_time) 

을 사용하고 있습니다하지만이 날짜에 그 적용되지는 현재 시간대의 대상이 될 것으로 보인다.

SQL 또는 코드로 변환해도 상관 없습니다. 나는 펄에서 일하고있다.

+0

GMT/UTC 및 BST는 현재 어떤 행을 알 수 있습니까? – Joe

+0

시스템에는 없습니다. 그러므로 내 질문. –

+0

이 열은 어떻게 채워 집니까? – Powerlord

답변

3

다음 열에서 암시 시간대가이 이며, 그것은 하나 개의 시간대이다 "두 개의 서로 다른 시간대"아니다는 올슨 DB에 Europe/London이라고 나 POSIX TZ 형식의 GMT0BST,M3.5.0/1,M10.5.0/2DateTime 모듈을 사용하거나 POSIX 기능을 영리하게 사용하여 이러한 시간을 쉽게 변환 할 수 있어야합니다 (BST가 있었는지 여부를 나타내는 표시를 저장하지 않으면 해결할 수없는 가을 전환 주변의 모호한 시간 제외). 그 당시에 DateTime를 사용

예 : SQL 2008와

use DateTime::Format::MSSQL; 
# In reality you would get this from the DB. 
my $input = "2009-11-30 16:13:18.123"; 
my $dt = DateTime::Format::MSSQL->parse_datetime($input); 
$dt->set_time_zone("Europe/London"); 
print "Unix time is ", $dt->epoch, "\n"; 
+0

감사합니다. 그것은 그것이 해결 될 수 있다는 것을 안심 시키지만 실제 해결책은 아닙니다. –

+0

감사합니다. 나는 아침에 그것을 시도 할 것이다. –

+0

확인되었습니다. 세상은 한 번 더 안전합니다! 고맙습니다. –

0

UNIX 타임 스탬프는 일광 절약 시간제가없는 UTC입니다. 따라서 날짜가 GMT인지 BST인지를 알 수 없으면 UNIX 시간 소인으로 변환 할 수 없습니다. , 당신은 시간이 겨울에 여름과 GMT에서 BST 것을 의미하는 경우

+1

네 말이 맞아, 나는 BST가 시간대라고 가정하고 있었다. 분명히 그냥 여름 시간이야. hobbs의 대답은 당신이 필요로하는 것이어야합니다. – Andomar

+0

아, 평소처럼 실수가 있습니다. 나는 시간대를 의미하는 것이 아니라 오히려 시간을 상쇄했다. 감사. –

1

새로운 날짜 시간 유형이있다 : retaint 시간대 정보를 수행하고, 따라서 유닉스 시대에서 DIFF을 susbtract 할 수 있습니다 datetimeoffset있다. 그러나이 작업을 수행하려면 SQL 2008로 업그레이드해야하며 스키마를 다시 방문하고 열 유형을 변경하고 모든 기존 데이터를 소급하여 적절한 시간대를 설정해야합니다.

SQL 2008로 업그레이드 할 수없는 경우 UDT로 항상 날짜 정보를 저장하는 것이 좋습니다. 이는 DB에 삽입하기 전에 클라이언트에서 먼저 변환하는 것을 의미합니다. 사용자에게 로컬 시간으로 데이터를 표시하는 것은 다시 클라이언트에서 수행되어야합니다.

관련 문제