programing

TSQL: 현지 시간을 UTC로 변환하는 방법은 무엇입니까? (SQL Server 2008)

linuxpc 2023. 5. 26. 20:48
반응형

TSQL: 현지 시간을 UTC로 변환하는 방법은 무엇입니까? (SQL Server 2008)

우리는 다른 시간대와 일광 절약 시간 설정의 전역 시간 데이터를 처리해야 하는 애플리케이션을 처리하고 있습니다.이 개념은 모든 것을 내부적으로 UTC 형식으로 저장하고 현지화된 사용자 인터페이스에 대해서만 앞뒤로 변환하는 것입니다.SQL Server는 지정된 시간, 국가 및 시간대의 번역을 처리할 수 있는 메커니즘을 제공합니까?

이것은 일반적인 문제임에 틀림없는데, 구글이 사용할 수 있는 것을 찾지 않는 것이 놀랍습니다.

조언은?

이는 현재 SQL Server의 호스트와 동일한 UTC 오프셋을 가진 날짜에 적용되며 일광 절약 시간 변경은 고려하지 않습니다.교체하다YOUR_DATE변환할 현지 날짜와 함께.

SELECT DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), YOUR_DATE);

7년이 지났고...
실제로 필요한 작업을 완벽하게 수행하는 SQL Server 2016의 새로운 기능이 있습니다.
이것은 AT TIME ZONE이라고 불리며, DST(일광 절약 시간) 변경을 고려하여 날짜를 지정된 시간대로 변환합니다.
자세한 내용은 https://msdn.microsoft.com/en-us/library/mt612795.aspx 에서 확인할 수 있습니다.

이러한 답변 중 몇 가지를 통해 대략적인 정보를 얻을 수 있지만 일광 절약 시간 때문에 SQL Server 2005 및 이전 버전의 임의 날짜를 사용하여 수행하려는 작업을 수행할 수 없습니다.현재 로컬과 현재 UTC의 차이를 사용하면 현재 존재하는 오프셋을 얻을 수 있습니다.저는 문제의 날짜에 대한 오프셋을 결정할 방법을 찾지 못했습니다.

즉, SqlServer 2008은 이러한 문제를 해결할 수 있는 몇 가지 새로운 날짜 기능을 제공한다는 것을 알고 있지만 이전 버전을 사용하는 사람들은 이러한 제한 사항을 알고 있어야 합니다.

우리의 접근 방식은 UTC를 유지하고 변환의 정확성을 제어할 수 있는 클라이언트 측에서 변환을 수행하는 것입니다.

다음은 하나의 구역을 변환하는 코드입니다.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+에서만 작동하며, 특정 시간대로 변환할 때 일광 절약 시간제를 자동으로 고려하는 것이 장점입니다.

SQL Server 2016 이상 및 Azure SQL Database의 경우 기본 제공 문을 사용합니다.

이전 버전의 SQL Server의 경우 아래 나열된 대로 SQL Server 표준 시간대 지원 프로젝트를 사용하여 IANA 표준 시간대 간에 변환할 수 있습니다.

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)

숫자 옵션은 현지 시간 값이 일광 절약 시간의 영향을 받을 때 동작을 제어하기 위한 플래그입니다.이러한 내용은 프로젝트 설명서에 자세히 설명되어 있습니다.

에는 SQL Server 2008이라는 .datetimeoffset이런 종류의 물건에 정말 유용합니다.

http://msdn.microsoft.com/en-us/library/bb630289.aspx

그런 다음 기능을 사용할 수 있습니다.SWITCHOFFSET동일한 UTC 값을 유지하면서 한 시간대에서 다른 시간대로 이동합니다.

http://msdn.microsoft.com/en-us/library/bb677244.aspx

로컬 이벤트와 관련이 없는 모든 날짜/시간 저장소(예: 박물관에서 오후 12시-3시)에 DateTimeOffset을 사용하는 경향이 있습니다.

현재 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는 ISO8601 형식의 UTC/GMT 날짜를 로컬 날짜 시간으로 구문 분석하는 작업을 처리합니다.

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;
  };
}

네, 여기에 자세히 나와 있는 것처럼 어느 정도요.
) 에 . 비즈니스 하는 것입니다.

GETUTCDATE() 함수를 사용하여 UTC 날짜 시간을 가져올 수 있습니다. 아마도 GETUTCDATE()와 GETDATE() 간의 차이를 선택하고 이 차이를 사용하여 UTC로 날짜를 조정할 수 있습니다.

그러나 비즈니스 계층(예: .NET)에서 올바른 날짜 시간을 훨씬 쉽게 제어할 수 있다는 이전 메시지에 동의합니다.

SUBSTRING(CONVERT(VARCHAR(34), SYSDATETIMEOFFSET()), 29, 5)

반환(예:):

-06:0

100% 긍정적인 것은 아닙니다.

샘플 사용량:

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

언급URL : https://stackoverflow.com/questions/1205142/tsql-how-to-convert-local-time-to-utc-sql-server-2008

반응형