2017-09-24 2 views
0

여러 시간대의 사용자를 처리하고 특정 시간대에 대해 날짜를 올바르게 표시 할 수 있어야하는 응용 프로그램을 만들고 있습니다.여러 시간대를 처리하는 시간대에서

나는 아래의 코드를 예제로 만들었지 만, 올바른 방법으로 시간대 문제를 처리하는 것이 무엇인지 혼란스러워합니다.

데이터베이스에 모든 날짜를 UTC로 저장하고 이에 따라 AT TIME ZONE을 사용하여 저장하는 것이 가장 좋습니까? 아니면 다른 방법으로 생각해야합니까?

Create Table #Test 
(
    SampleDate datetimeoffset(7) 
) 

Create Table #Test2 
(
    SampleDate datetimeoffset(7) 
) 

Create Table #Test3 
(
    SampleDate datetime 
) 

insert into #Test select getdate() 
insert into #Test2 select getdate() AT TIME ZONE 'AUS Eastern Standard Time' 
insert into #Test3 select getdate() 


select 
    SampleDate, 
    SampleDate AT TIME ZONE 'AUS Eastern Standard Time', 
    SampleDate AT TIME ZONE 'AUS Central Standard Time', 
    SampleDate AT TIME ZONE 'Aus Central W. Standard Time' 
from #Test 

select 
    SampleDate, 
    SampleDate AT TIME ZONE 'AUS Eastern Standard Time', 
    SampleDate AT TIME ZONE 'AUS Central Standard Time', 
    SampleDate AT TIME ZONE 'Aus Central W. Standard Time' 
from #Test2 

select 
    SampleDate, 
    SampleDate AT TIME ZONE 'AUS Eastern Standard Time', 
    SampleDate AT TIME ZONE 'AUS Central Standard Time', 
    SampleDate AT TIME ZONE 'Aus Central W. Standard Time' 
from #Test3 

drop table #Test 
drop table #Test2 
drop table #Test3 

테스트

2017-09-24 10:59:47.4233333 +00:00 
2017-09-24 20:59:47.4233333 +10:00 
2017-09-24 20:29:47.4233333 +09:30 
2017-09-24 19:44:47.4233333 +08:45 

Test2를가

2017-09-24 10:59:47.4230000 +10:00 
2017-09-24 10:59:47.4230000 +10:00 
2017-09-24 10:29:47.4230000 +09:30 
2017-09-24 09:44:47.4230000 +08:45 

테스트 3가

2017-09-24 10:59:47.423 
2017-09-24 10:59:47.423 +10:00 
2017-09-24 10:59:47.423 +09:30 
2017-09-24 10:59:47.423 +08:45 
+0

다른 시간대가 필요하면'datetimeoffset'을 사용하십시오. 그것이 그곳에있는 것입니다. –

+0

감사합니다 @ GordonLinoff,하지만 당신은 테이블에 무엇을 저장해야합니까? 항상 UTC를 저장합니까, 아니면 특정 사용자의 날짜/시간과 오프셋을 저장합니까? – Philip

+0

. . 오, 그게 어떻게 사용되고 있는지에 달렸습니다. 나는 그들을 같은 시간대에 저장하는 경향이 있다고 생각하지만 여러 지역 시간대에 저장하는 데는 유효한 이유가 있습니다. –

답변

0

SQL 애저 데이터베이스는 항상 UTC 시간을 사용 결과 결과 결과. 따라서 datetimeoffset을 사용해야합니다.

또한 getdate()를 사용하는 대신 sysdatetimeoffset()을 사용하여 시스템 날짜를 캡처해야합니다.

데이터베이스 테이블에서 날짜를 검색 할 때 "AT TIME ZONE"을 사용해야합니다.

희망이 도움이됩니다.