TSQL:변환하는 방법 현지 시간 UTC?(SQL Server2008)
-
05-07-2019 - |
문제
우리는 다루고 있는 응용 프로그램과 요구를 처리하는 글로벌 시간을 데이터에서 다른 시간대 및 일광 절약 시간 설정입니다.아이디어 스토어에서 모든 것을 UTC 형식으로 내부적으로만 앞뒤로 변환을 위한 지역화된 사용자 인터페이스를 제공합니다.는 SQL 서버 제공하기 위한 메커니즘을 다루는 번역 주어진 시간,국가 및 시간대가?
이 일반적인 문제,그래서 놀랐어요 구글지 않을 차례로 아무것도 사용할 수 있습니다.
어떤 점?
해결책
7 년이 지났고 ...
실제로 필요한 것을 정확하게 수행하는이 새로운 SQL Server 2016 기능이 있습니다.
시간대에서 호출되며 DST (일광 절약 시간) 변경을 고려하여 날짜를 지정된 시간대로 변환합니다.
추가 정보는 여기에 있습니다 :https://msdn.microsoft.com/en-us/library/mt612795.aspx
다른 팁
이것은 현재 SQL Server의 호스트와 동일한 UTC 오프셋이있는 날짜에 대해 작동합니다. 일광 절약 변경을 설명하지 않습니다. 바꾸다 YOUR_DATE
로컬 날짜가 전환됩니다.
SELECT DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), YOUR_DATE);
이 답변 중 일부는 야구장에서 당신을 얻을 수 있지만, 일광 절약 시간으로 인해 SQLServer 2005의 임의의 날짜로 당신이하려는 일을 할 수 없습니다. 현재 로컬과 현재 UTC의 차이를 사용하면 오늘날 존재하는 오프셋이 제공됩니다. 문제의 날짜에 대한 오프셋이 무엇인지 결정할 방법을 찾지 못했습니다.
즉, SQLSERVER 2008은 그 문제를 해결할 수있는 새로운 날짜 기능을 제공하지만 이전 버전을 사용하는 사람들은 한계를 알고 있어야합니다.
우리의 접근 방식은 UTC를 지속시키고 전환의 정확성을 더 많이 제어 할 수있는 클라이언트 측에서 변환을 수행하는 것입니다.
SQL Server 2008에는 유형이 호출됩니다 datetimeoffset
. 이 유형의 물건에 정말 유용합니다.
http://msdn.microsoft.com/en-us/library/bb630289.aspx
그런 다음 함수를 사용할 수 있습니다 SWITCHOFFSET
한 번에서 다른 시간대로 이동하지만 여전히 동일한 UTC 값을 유지합니다.
http://msdn.microsoft.com/en-us/library/bb677244.aspx
롭
당신은 내 사용할 수 있습니다 SQL Server 시간대 지원 IANA Standard Time Zones간에 변환하는 프로젝트, 여기에 나열된대로.
UTC는 로컬입니다.
SELECT Tzdb.UtcToLocal('2015-07-01 00:00:00', 'America/Los_Angeles')
UTC 로의 로컬은 다음과 같습니다.
SELECT Tzdb.LocalToUtc('2015-07-01 00:00:00', 'America/Los_Angeles', 1, 1)
숫자 옵션은 현지 시간 값이 일광 절약 시간의 영향을받는 경우 동작을 제어하기위한 플래그입니다. 이들은 프로젝트 문서에 자세히 설명되어 있습니다.
다음은 하나의 영역을 변환하는 코드입니다 DateTime
다른 구역으로 DateTime
DECLARE @UTCDateTime DATETIME = GETUTCDATE();
DECLARE @ConvertedZoneDateTime DATETIME;
-- 'UTC' to 'India Standard Time' DATETIME
SET @ConvertedZoneDateTime = @UTCDateTime AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time'
SELECT @UTCDateTime AS UTCDATE,@ConvertedZoneDateTime AS IndiaStandardTime
-- 'India Standard Time' to 'UTC' DATETIME
SET @UTCDateTime = @ConvertedZoneDateTime AT TIME ZONE 'India Standard Time' AT TIME ZONE 'UTC'
SELECT @ConvertedZoneDateTime AS IndiaStandardTime,@UTCDateTime AS UTCDATE
메모: AT TIME ZONE
SQL Server 2016+에서만 작동합니다 그리고 장점은 그것입니다 자동으로 일광을 고려합니다 특정 시간대로 변환 할 때
지역 행사와 관련이없는 모든 날짜 시간 저장소에 DateTimeOffset을 사용하는 경향이 있습니다 (예 : Meeting/Party 등, 박물관에서 오후 12 시부 터 오후 3시).
현재 DTO를 UTC로 얻으려면 :
DECLARE @utcNow DATETIMEOFFSET = CONVERT(DATETIMEOFFSET, SYSUTCDATETIME())
DECLARE @utcToday DATE = CONVERT(DATE, @utcNow);
DECLARE @utcTomorrow DATE = DATEADD(D, 1, @utcNow);
SELECT @utcToday [today]
,@utcTomorrow [tomorrow]
,@utcNow [utcNow]
참고 : 와이어를 보낼 때는 항상 UTC를 사용합니다 ... 클라이언트 측 JS는 로컬 UTC로 쉽게오고 나갈 수 있습니다. 보다: new Date().toJSON()
...
다음 JS는 UTC/GMT 날짜를 ISO8601 형식으로 로컬 데이터 타임으로 구문 분석합니다.
if (typeof Date.fromISOString != 'function') {
//method to handle conversion from an ISO-8601 style string to a Date object
// Date.fromISOString("2009-07-03T16:09:45Z")
// Fri Jul 03 2009 09:09:45 GMT-0700
Date.fromISOString = function(input) {
var date = new Date(input); //EcmaScript5 includes ISO-8601 style parsing
if (!isNaN(date)) return date;
//early shorting of invalid input
if (typeof input !== "string" || input.length < 10 || input.length > 40) return null;
var iso8601Format = /^(\d{4})-(\d{2})-(\d{2})((([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d{1,12}))?)?)?)?)?([Zz]|([-+])(\d{2})\:?(\d{2}))?$/;
//normalize input
var input = input.toString().replace(/^\s+/,'').replace(/\s+$/,'');
if (!iso8601Format.test(input))
return null; //invalid format
var d = input.match(iso8601Format);
var offset = 0;
date = new Date(+d[1], +d[2]-1, +d[3], +d[7] || 0, +d[8] || 0, +d[10] || 0, Math.round(+("0." + (d[12] || 0)) * 1000));
//use specified offset
if (d[13] == 'Z') offset = 0-date.getTimezoneOffset();
else if (d[13]) offset = ((parseInt(d[15],10) * 60) + (parseInt(d[16],10)) * ((d[14] == '-') ? 1 : -1)) - date.getTimezoneOffset();
date.setTime(date.getTime() + (offset * 60000));
if (date.getTime() <= new Date(-62135571600000).getTime()) // CLR DateTime.MinValue
return null;
return date;
};
}
예, 자세한 내용은 어느 정도입니다 여기.
내가 사용한 접근법 (2008 년 이전)은 DB에 삽입하기 전에 .NET 비즈니스 로직을 변환하는 것입니다.
당신이 사용할 수 있습 GETUTCDATE()함수를 얻 UTC datetime 아마 당신이 선택할 수 있는 사이에 차이 GETUTCDATE()및 GETDATE()를 사용하여 이러한 차이 위험에 직 여행 날짜를 UTC
그러나 나는 이전의 메시지는 훨씬 쉽게 제어하는 권리의 날짜/시간 비즈니스 층(습니다.NET,for example).
샘플 사용 :
SELECT
Getdate=GETDATE()
,SysDateTimeOffset=SYSDATETIMEOFFSET()
,SWITCHOFFSET=SWITCHOFFSET(SYSDATETIMEOFFSET(),0)
,GetutcDate=GETUTCDATE()
GO
보고:
Getdate SysDateTimeOffset SWITCHOFFSET GetutcDate
2013-12-06 15:54:55.373 2013-12-06 15:54:55.3765498 -08:00 2013-12-06 23:54:55.3765498 +00:00 2013-12-06 23:54:55.373