문제

우리는 다루고 있는 응용 프로그램과 요구를 처리하는 글로벌 시간을 데이터에서 다른 시간대 및 일광 절약 시간 설정입니다.아이디어 스토어에서 모든 것을 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top