2016-11-02 3 views
1

현지 시간으로 datetime 값을 표시하려고합니다. 기본적으로 Azure SQL 데이터베이스는 날짜와 시간을 UTC로 저장합니다.이 방법은 없습니다. (이것은 전제 SQL Server에서 마이그레이션 할 때 고통 스러웠습니다.) 중앙 유럽 시간에 저장된 시간 값을 표시하고 싶습니다.Azure SQL 표시 현지 시간

현지 시간은 11:30 (CET)입니다. UTC 시간은 10시 30 분입니다.

DECLARE @TestTime DATETIME; 
SET @TestTime = '2016-11-02 10:30:00' 

SELECT @TestTime 
--Returns 2016-11-02 10:30:00 
SELECT @TestTime AT TIME ZONE 'Central European Standard Time' 
--Returns 02 November 2016 10:30:00 +01:00 

어쨌든 2016-11-02 11:30:00을 반환해야합니다. 이제 재미있는 부분 :

here 제시 한 바와 같이 :

SELECT convert(DATETIME,@TestTime AT TIME ZONE 'Central European Standard Time',1) 
--Returns 2016-11-02 09:30:00 So instead of adding the timezonedifference it subtracts it. 

이 작동하지만, 나를 아프게 :

SELECT DATEADD(MINUTE,DATEPART(tz,@TestTime AT TIME ZONE 'Central European Standard Time'),@TestTime) 
--Returns 2016-11-02 11:30:00 

비슷한 솔루션은 here을 제안되었다, 그러나 함께 재생 문자열 연산. 내 의심은 AT TIME ZONE에서 뭔가 잘못되었다는 것입니다. 11:30 +1이 아니라 10:30 +1이 아니어야합니다.

현지 시간으로 UTC 시간을 표시하는 적절한 방법이 있습니까? 이 "해킹"은 매우 지저분한 것으로 느껴질 수 있습니다. 특히 어느 시점에서든 작업이 중단 될 수 있습니다 (예 : Microsoft에서 수정/버그가 있음).

감사합니다!

+0

로컬 날짜 시간을 무엇으로 표시하려고합니까? –

+0

@drediske [CET] (https://www.timeanddate.com/time/zones/cet). 이 예제에서보고 싶은 것은 11:30입니다. 실제로 내 db에는 몇 가지 다른 시간대의 사용자가 있으며 일광 절약 시간제도 재생되므로 다소 복잡합니다.) 저장된 UTC 시간 값을 원하는 현지 시간으로 변환 할 수있는 것으로 귀결됩니다. – vacip

+0

이 주석이 달린 -1을 좋아합니다 ... 투표자가 나를 밝혀 주면 질문을 개선하고 싶습니다. – vacip

답변

3

AT TIME ZONE 문은 별개의 작업을 수행합니다

  1. 어설 하려면를datetime (또는 datetime2가) 따라서 해당 영역에 대한 올바른 오프셋을 찾고, 특정 시간대에 올바른 오프셋이 적용된 datetimeoffset 값을 반환합니다.

  2. 다른 시간대에 datetimeoffset 값이 시간에 정확한 지점을 핀에 소스 값로부터의 오프셋 (offset) 사용변환하려면, 다음 요청 시간대 오프셋 새로운 찾고 그것을 적용 . 이 경우 현지 시간과 오프셋이 원본과 다를 수 있지만 동일한 시간을 나타내는 datetimeoffset이 반환됩니다.

첫 번째 부분 만 사용하고 있습니다. datetime을 UTC에서 특정 시간대로 변환하려면 을 사용해야합니다.

SELECT @TestTime AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time' 

AT TIME ZONE 입력 datetime 오프셋 용 +00:00을 갖는 datetimeoffset 결과 UTC는 것을 주장한다. 두 번째 AT TIME ZONE은 요청한 시간대로 변환합니다.

+1

또한, 귀하의 프로필에 귀하가 부다페스트에 있다고 표시되어 있으므로, 대신에 "중부 유럽 표준시"구역을 사용하는 것이 더 정확할 것입니다. 이 경우에도 ID에 'an'이외의 차이는 없습니다. [이 매핑] (http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml)을 참조하십시오. –

+0

와우, 고마워요! 조금 이상하지만 실제로 당신의 설명에 의미가 있습니다. 그리고''중유럽 표준 시간 (Central Europe Standard Time) '에 대한 또 하나의 큰 감사, 나는 당신의 지식에 앞서 활을 .다. :) – vacip

관련 문제