복붙노트

[SQL] select 문에서 현지 시간으로 UTC에서 날짜 시간 열을 변환

SQL

select 문에서 현지 시간으로 UTC에서 날짜 시간 열을 변환

나는 몇 가지 SQL 쿼리를 선택하고있어 내 쿼리 결과에서 현지 시간으로 표시 할 현지 시간으로 내 UTC 날짜 열을 변환하고 싶습니다. 참고 난 내 데이터베이스에 대해 수동 및 임의의 SQL 쿼리를하고있는 중이 야 때 코드를 통해 오히려이 변환을 찾고 있지 않다.

해결법

  1. ==============================

    1.SQL 서버 2008 이상에 다음과 같이이 작업을 수행 할 수 있습니다 :

    SQL 서버 2008 이상에 다음과 같이이 작업을 수행 할 수 있습니다 :

    SELECT CONVERT(datetime, 
                   SWITCHOFFSET(CONVERT(datetimeoffset, 
                                        MyTable.UtcColumn), 
                                DATENAME(TzOffset, SYSDATETIMEOFFSET()))) 
           AS ColumnInLocalTime
    FROM MyTable
    

    또한 자세한 덜 할 수 있습니다 :

    SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), MyTable.UtcColumn) 
           AS ColumnInLocalTime
    FROM MyTable
    

    무슨 일이 있어도 사용하지 마십시오 - 작업이 원자 없기 때문에, 날짜를 빼기 위해, 당신이 경우에 인해 시스템 날짜 및 현지 날짜 사이의 경쟁 조건에 불확실한 결과를 얻을 비 원자, 즉 서로 다른 시간에 (에서 확인되고 ).

    이 답변으로 계정에 DST을하지 않습니다. 당신이 DST 조정을 포함 할 경우, 또한 다음과 같은 SO 질문을 참조하십시오 :

    SQL Server의 일광 절약 시간 시작 및 종료 기능을 만드는 방법

  2. ==============================

    2.나는 특정 시간대 (NOT 서버의 시간대 푸른 SQL 데이터베이스를 UTC로 실행되기 때문에)에 날짜를 UTC로 저장된 날짜를 받고 이러한 예 중 하나가 도움이되지 않았다. 이것은 내가 그것을 처리하는 방법입니다. 그것은 우아한 아니지만 그것은 간단하고 다른 테이블을 유지하지 않고 당신에게 정답을 제공합니다 :

    나는 특정 시간대 (NOT 서버의 시간대 푸른 SQL 데이터베이스를 UTC로 실행되기 때문에)에 날짜를 UTC로 저장된 날짜를 받고 이러한 예 중 하나가 도움이되지 않았다. 이것은 내가 그것을 처리하는 방법입니다. 그것은 우아한 아니지만 그것은 간단하고 다른 테이블을 유지하지 않고 당신에게 정답을 제공합니다 :

    select CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET, 
    dateTimeField AT TIME ZONE 'Eastern Standard Time')))
    
  3. ==============================

    3.당신이 당신의 서버의 위치가 아닌 다른 변환이 필요한 경우, 여기 당신이 표준 오프셋을 통과 할 수 있으며 미국의 일광 절약 시간을 차지하는 기능입니다 :

    당신이 당신의 서버의 위치가 아닌 다른 변환이 필요한 경우, 여기 당신이 표준 오프셋을 통과 할 수 있으며 미국의 일광 절약 시간을 차지하는 기능입니다 :

    -- =============================================
    -- Author:      Ron Smith
    -- Create date: 2013-10-23
    -- Description: Converts UTC to DST
    --              based on passed Standard offset
    -- =============================================
    CREATE FUNCTION [dbo].[fn_UTC_to_DST]
    (
        @UTC datetime,
        @StandardOffset int
    )
    RETURNS datetime
    AS
    BEGIN
    
        declare 
            @DST datetime,
            @SSM datetime, -- Second Sunday in March
            @FSN datetime  -- First Sunday in November
    
        -- get DST Range
        set @SSM = datename(year,@UTC) + '0314' 
        set @SSM = dateadd(hour,2,dateadd(day,datepart(dw,@SSM)*-1+1,@SSM))
        set @FSN = datename(year,@UTC) + '1107'
        set @FSN = dateadd(second,-1,dateadd(hour,2,dateadd(day,datepart(dw,@FSN)*-1+1,@FSN)))
    
        -- add an hour to @StandardOffset if @UTC is in DST range
        if @UTC between @SSM and @FSN
            set @StandardOffset = @StandardOffset + 1
    
        -- convert to DST
        set @DST = dateadd(hour,@StandardOffset,@UTC)
    
        -- return converted datetime
        return @DST
    
    END
    
    GO
    
  4. ==============================

    4.현지 날짜 시간은 동부 표준시 말이며 푸른 SQL 이상 SQL 서버 2016에서 다음, 그에게 UTC로 변환하려는 경우, 당신은 할 수 있습니다 :

    현지 날짜 시간은 동부 표준시 말이며 푸른 SQL 이상 SQL 서버 2016에서 다음, 그에게 UTC로 변환하려는 경우, 당신은 할 수 있습니다 :

    SELECT YourUtcColumn AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS
           LocalTime
    FROM   YourTable
    

    시간대 이름의 전체 목록을 찾을 수 있습니다 :

    SELECT * FROM sys.time_zone_info 
    

    일광 절약 고려, 그것은 동부 표준 시간 임에도 불구하고 - 그리고 예, 시간대가 잘못 지정됩니다.

  5. ==============================

    5.새 SQL Server 2016의 기회를 사용 :

    새 SQL Server 2016의 기회를 사용 :

    CREATE FUNCTION ToLocalTime(@dtUtc datetime, @timezoneId nvarchar(256))
    RETURNS datetime
    AS BEGIN
    
    return @dtUtc AT TIME ZONE 'UTC' AT TIME ZONE @timezoneId
    
    /* -- second way, faster
    
    return SWITCHOFFSET(@dtUtc , DATENAME(tz, @dtUtc AT TIME ZONE @timezoneId))
    
    */
    
    /* -- third way
    
    declare @dtLocal datetimeoffset
    set @dtLocal = @dtUtc AT TIME ZONE @timezoneId
    return dateadd(minute, DATEPART (TZoffset, @dtLocal), @dtUtc)
    
    */
    
    END
    GO
    

    그러나 CLR 절차는 빠르게 5 회에서 작동 : '- (

    하나 개의 시간대 오프셋 있음에주의 겨울 또는 여름 시간을 변경할 수 있습니다. 예를 들면

    select cast('2017-02-08 09:00:00.000' as datetime) AT TIME ZONE 'Eastern Standard Time'
    select cast('2017-08-08 09:00:00.000' as datetime) AT TIME ZONE 'Eastern Standard Time'
    

    결과 :

    2017-02-08 09:00:00.000 -05:00
    2017-08-08 09:00:00.000 -04:00
    

    당신은 오프셋 상수를 추가 할 수 없습니다.

  6. ==============================

    6.데이터베이스에 CLR을 가능하게하는 옵션뿐만 아니라 SQL 서버의 시간대를 사용하는 경우, 그것은 아주 쉽게 닷넷에서 쓸 수 있습니다.

    데이터베이스에 CLR을 가능하게하는 옵션뿐만 아니라 SQL 서버의 시간대를 사용하는 경우, 그것은 아주 쉽게 닷넷에서 쓸 수 있습니다.

    public partial class UserDefinedFunctions
    {
        [Microsoft.SqlServer.Server.SqlFunction]
        public static SqlDateTime fn_GetLocalFromUTC(SqlDateTime UTC)
        {
            if (UTC.IsNull)
                return UTC;
    
            return new SqlDateTime(UTC.Value.ToLocalTime());
        }
    }
    

    UTC의 날짜 시간 값에 가서 서버에 로컬 날짜 시간 값의 상대가 나옵니다. 널 값은 널 (null)을 반환합니다.

  7. ==============================

    7.정확하고 일반적인 방법으로이 작업을 수행하는 간단한 방법은 없습니다.

    정확하고 일반적인 방법으로이 작업을 수행하는 간단한 방법은 없습니다.

    우선 오프셋 문제의 날짜, 시간대 및 DST에 달려 있음을 이해하여야한다. 에 GetDate ()는 - GETUTCDATE는 관련이없는 서버의 TZ, 당신에게 오프셋 오늘을 제공합니다.

    나는 두 작업 솔루션을 보았다 내가 많이 검색 할 수 있습니다.

    같은 시간대 및 TZ 당 DST 규칙 등의 기본 데이터 테이블의 부부와 함께 1) 사용자 정의 SQL 함수. 근무하지만 매우 우아하지. 내가 코드를 소유하지 않기 때문에 나는 그것을 게시 할 수 없습니다.

    편집 다음은 이러한 방법의 예는 https://gist.github.com/drumsta/16b79cee6bc195cd89c8

    2) DB에 어셈블리 .NET을 추가, 닷넷 아주 쉽게이 작업을 수행 할 수 있습니다. 이것은 매우 잘 작동하지만, 단점은 서버 수준에서 여러 매개 변수를 구성 할 필요가 있으며 설정은 쉽게 예를 들면, 고장 데이터베이스를 복원합니다. 나는이 방법을 사용하지만 코드를 소유하지 않기 때문에 나는 그것을 게시 캔트.

  8. ==============================

    8.다음은 일광 절약 차지, UTC 오프셋 및 특정 연도에 고정되지 않는 버전입니다.

    다음은 일광 절약 차지, UTC 오프셋 및 특정 연도에 고정되지 않는 버전입니다.

    ---------------------------------------------------------------------------------------------------
    --Name:     udfToLocalTime.sql
    --Purpose:  To convert UTC to local US time accounting for DST
    --Author:   Patrick Slesicki
    --Date:     3/25/2014
    --Notes:    Works on SQL Server 2008R2 and later, maybe SQL Server 2008 as well.
    --          Good only for US States observing the Energy Policy Act of 2005.
    --          Function doesn't apply for years prior to 2007.
    --          Function assumes that the 1st day of the week is Sunday.
    --Tests:        
    --          SELECT dbo.udfToLocalTime('2014-03-09 9:00', DEFAULT)
    --          SELECT dbo.udfToLocalTime('2014-03-09 10:00', DEFAULT)
    --          SELECT dbo.udfToLocalTime('2014-11-02 8:00', DEFAULT)
    --          SELECT dbo.udfToLocalTime('2014-11-02 9:00', DEFAULT)
    ---------------------------------------------------------------------------------------------------
    ALTER FUNCTION udfToLocalTime
        (
        @UtcDateTime    AS DATETIME
        ,@UtcOffset     AS INT = -8 --PST
        )
    RETURNS DATETIME
    AS 
    BEGIN
        DECLARE 
            @PstDateTime    AS DATETIME
            ,@Year          AS CHAR(4)
            ,@DstStart      AS DATETIME
            ,@DstEnd        AS DATETIME
            ,@Mar1          AS DATETIME
            ,@Nov1          AS DATETIME
            ,@MarTime       AS TIME
            ,@NovTime       AS TIME
            ,@Mar1Day       AS INT
            ,@Nov1Day       AS INT
            ,@MarDiff       AS INT
            ,@NovDiff       AS INT
    
        SELECT
            @Year       = YEAR(@UtcDateTime)
            ,@MarTime   = CONVERT(TIME, DATEADD(HOUR, -@UtcOffset, '1900-01-01 02:00'))
            ,@NovTime   = CONVERT(TIME, DATEADD(HOUR, -@UtcOffset - 1, '1900-01-01 02:00'))
            ,@Mar1      = CONVERT(CHAR(16), @Year + '-03-01 ' + CONVERT(CHAR(5), @MarTime), 126)
            ,@Nov1      = CONVERT(CHAR(16), @Year + '-11-01 ' + CONVERT(CHAR(5), @NovTime), 126)
            ,@Mar1Day   = DATEPART(WEEKDAY, @Mar1)
            ,@Nov1Day   = DATEPART(WEEKDAY, @Nov1)
    
        --Get number of days between Mar 1 and DST start date
        IF @Mar1Day = 1 SET @MarDiff = 7
        ELSE SET @MarDiff = 15 - @Mar1Day
    
        --Get number of days between Nov 1 and DST end date
        IF @Nov1Day = 1 SET @NovDiff = 0
        ELSE SET @NovDiff = 8 - @Nov1Day
    
        --Get DST start and end dates
        SELECT 
            @DstStart   = DATEADD(DAY, @MarDiff, @Mar1)
            ,@DstEnd    = DATEADD(DAY, @NovDiff, @Nov1)
    
        --Change UTC offset if @UtcDateTime is in DST Range
        IF @UtcDateTime >= @DstStart AND @UtcDateTime < @DstEnd SET @UtcOffset = @UtcOffset + 1
    
        --Get Conversion
        SET @PstDateTime = DATEADD(HOUR, @UtcOffset, @UtcDateTime)
        RETURN @PstDateTime
    END
    GO
    
  9. ==============================

    9.나는 많은 양의 데이터가있을 때 기능 해제 방법 하나가 너무 느린 것으로 판명. 그래서 시간은 diff의 계산을 허용 할 테이블 함수에 합류 통해했다. 그것은 기본적으로 오프셋 시간과 날짜 부분입니다. 년 4 행 것이다. 테이블 함수 그래서

    나는 많은 양의 데이터가있을 때 기능 해제 방법 하나가 너무 느린 것으로 판명. 그래서 시간은 diff의 계산을 허용 할 테이블 함수에 합류 통해했다. 그것은 기본적으로 오프셋 시간과 날짜 부분입니다. 년 4 행 것이다. 테이블 함수 그래서

    dbo.fn_getTimeZoneOffsets('3/1/2007 7:00am', '11/5/2007 9:00am', 'EPT')
    

    이 테이블을 반환합니다 :

    startTime          endTime   offset  isHr2
    3/1/07 7:00     3/11/07 6:59    -5    0
    3/11/07 7:00    11/4/07 6:59    -4    0
    11/4/07 7:00    11/4/07 7:59    -5    1
    11/4/07 8:00    11/5/07 9:00    -5    0
    

    그것은 일광 절약에 대한 계정을하지 않습니다. 그것을 사용하는 방법의 샘플은 이하와 전체 블로그 포스트는 여기에있다.

    select mt.startTime as startUTC, 
        dateadd(hh, tzStart.offset, mt.startTime) as startLocal, 
        tzStart.isHr2
    from MyTable mt 
    inner join dbo.fn_getTimeZoneOffsets(@startViewUTC, @endViewUTC, @timeZone)  tzStart
    on mt.startTime between tzStart.startTime and tzStart.endTime
    
  10. ==============================

    10.이들 중 아무도 나를 위해 일한 그러나 이것은 아래의 100 %를했다. 내가처럼 변환하는 노력이 캔 도움말 다른 사람을 바랍니다.

    이들 중 아무도 나를 위해 일한 그러나 이것은 아래의 100 %를했다. 내가처럼 변환하는 노력이 캔 도움말 다른 사람을 바랍니다.

    CREATE FUNCTION [dbo].[fn_UTC_to_EST]
    (
        @UTC datetime,
        @StandardOffset int
    )
    RETURNS datetime
    AS
    BEGIN
    
    declare 
        @DST datetime,
        @SSM datetime, -- Second Sunday in March
        @FSN datetime  -- First Sunday in November
    -- get DST Range
    set @SSM = DATEADD(dd,7 + (6-(DATEDIFF(dd,0,DATEADD(mm,(YEAR(GETDATE())-1900) * 12 + 2,0))%7)),DATEADD(mm,(YEAR(GETDATE())-1900) * 12 + 2,0))+'02:00:00' 
    set @FSN = DATEADD(dd, (6-(DATEDIFF(dd,0,DATEADD(mm,(YEAR(GETDATE())-1900) * 12 + 10,0))%7)),DATEADD(mm,(YEAR(GETDATE())-1900) * 12 + 10,0)) +'02:00:00'
    
    -- add an hour to @StandardOffset if @UTC is in DST range
    if @UTC between @SSM and @FSN
        set @StandardOffset = @StandardOffset + 1
    
    -- convert to DST
    set @DST = dateadd(hour,@StandardOffset,@UTC)
    
    -- return converted datetime
    return @DST
    
    END
    
  11. ==============================

    11.

     declare @mydate2 datetime
     set @mydate2=Getdate()
     select @mydate2 as mydate,
     dateadd(minute, datediff(minute,getdate(),@mydate2),getutcdate())
    
  12. ==============================

    12.론의 답변에 오류가 있습니다. 그것은 UTC와 동등한이 필요한 오전 2시 현지 시간을 사용합니다. 나는 아래의 수정 된 버전이 나타납니다 그래서 론의 대답에 대한 언급을 충분히 명성 포인트가 없습니다 :

    론의 답변에 오류가 있습니다. 그것은 UTC와 동등한이 필요한 오전 2시 현지 시간을 사용합니다. 나는 아래의 수정 된 버전이 나타납니다 그래서 론의 대답에 대한 언급을 충분히 명성 포인트가 없습니다 :

    -- =============================================
    -- Author:      Ron Smith
    -- Create date: 2013-10-23
    -- Description: Converts UTC to DST
    --              based on passed Standard offset
    -- =============================================
    CREATE FUNCTION [dbo].[fn_UTC_to_DST]
    (
        @UTC datetime,
        @StandardOffset int
    )
    RETURNS datetime
    AS
    BEGIN
    
    declare 
        @DST datetime,
        @SSM datetime, -- Second Sunday in March
        @FSN datetime  -- First Sunday in November
    -- get DST Range
    set @SSM = datename(year,@UTC) + '0314' 
    set @SSM = dateadd(hour,2 - @StandardOffset,dateadd(day,datepart(dw,@SSM)*-1+1,@SSM))
    set @FSN = datename(year,@UTC) + '1107'
    set @FSN = dateadd(second,-1,dateadd(hour,2 - (@StandardOffset + 1),dateadd(day,datepart(dw,@FSN)*-1+1,@FSN)))
    
    -- add an hour to @StandardOffset if @UTC is in DST range
    if @UTC between @SSM and @FSN
        set @StandardOffset = @StandardOffset + 1
    
    -- convert to DST
    set @DST = dateadd(hour,@StandardOffset,@UTC)
    
    -- return converted datetime
    return @DST
    
    END
    
  13. ==============================

    13.특정 날짜와 유닉스 에포크 사이의 초 단지 숫자입니다 타임 스탬프 유닉스,

    특정 날짜와 유닉스 에포크 사이의 초 단지 숫자입니다 타임 스탬프 유닉스,

    SELECT DATEDIFF (SECOND, {D '1970-01-01'}, GETDATE ()) //이 윌 돌아 가기 UNIX 타임 스탬프에서 SQL 서버

    당신은 오프셋 나라를 사용하여 유닉스 UTC 변환 현지 날짜 시간 함수를 만들 수 있습니다 유닉스 타임 스탬프에서 SQL 서버로 기능

  14. ==============================

    14.간단 해. 푸른 SQL Server에 대한이 시도 :

    간단 해. 푸른 SQL Server에 대한이 시도 :

    SELECT YourDateTimeColumn AT TIME ZONE 'Eastern Standard Time' FROM YourTable
    

    현지 SQL Server의 경우 :

    SELECT CONVERT(datetime2, SWITCHOFFSET(CONVERT(datetimeoffset, gETDATE()), DATENAME(TzOffset, gETDATE() AT TIME ZONE 'Eastern Standard Time'))) FROM YourTable
    
  15. ==============================

    15.푸른 SQL 및 @@ 버전의 경우> = SQL 서버 2016 사용자는 아래 AT TIME ZONE를 사용하여 간단한 함수입니다.

    푸른 SQL 및 @@ 버전의 경우> = SQL 서버 2016 사용자는 아래 AT TIME ZONE를 사용하여 간단한 함수입니다.

    CREATE FUNCTION [dbo].[Global_Convert_UTCTimeTo_LocalTime]
    (
       @LocalTimeZone        VARCHAR(50),
       @UTCDateTime          DATETIME
    )
    RETURNS DATETIME
    AS
    BEGIN
       DECLARE @ConvertedDateTime DATETIME;
    
       SELECT @ConvertedDateTime = @UTCDateTime AT TIME ZONE 'UTC' AT TIME ZONE @LocalTimeZone
       RETURN @ConvertedDateTime
    
    END
    GO
    

    @LocalTimeZone가 취할 수있는 값의 유형의 경우,이 링크 또는 이동 KEY_LOCAL_MACHINE \ SOFTWARE \ 마이크로 소프트 \ 윈도우 NT를 \ CurrentVersion \ 시간대로 이동하십시오

  16. ==============================

    16.경고로 - 다음 (주 대신 분의 밀리 초)를 사용하려고하는 경우 :

    경고로 - 다음 (주 대신 분의 밀리 초)를 사용하려고하는 경우 :

        SELECT DATEADD(ms, DATEDIFF(ms, GETUTCDATE(), GETDATE()), MyTable.UtcColumn) 
        AS ColumnInLocalTime
        FROM MyTable
    

    DATEDIFF 부분은 항상 같은 번호를 반환하지 않습니다 있음을 유의하십시오. 그래서 밀리 초로 날짜 시간을 비교하는 데 사용하지 마십시오.

  17. ==============================

    17.나는이 기능을 빨리 별도의 테이블 또는 루프를 사용하는 다른 솔루션에 비해 것으로 나타났습니다. 그냥 기본 case 문이다. 4 월과 10 월 사이의 모든 개월 (동부 시간) 오프셋 -4 시간은 우리가 프린지 일 동안 몇 사례 라인을 추가 할 필요가있는 점을 감안. 그렇지 않으면, 오프셋은 -5 시간.

    나는이 기능을 빨리 별도의 테이블 또는 루프를 사용하는 다른 솔루션에 비해 것으로 나타났습니다. 그냥 기본 case 문이다. 4 월과 10 월 사이의 모든 개월 (동부 시간) 오프셋 -4 시간은 우리가 프린지 일 동안 몇 사례 라인을 추가 할 필요가있는 점을 감안. 그렇지 않으면, 오프셋은 -5 시간.

    이 동부 시간으로 UTC에서 변환 특정이지만, 필요에 따라 추가 시간대 기능을 추가 할 수 있습니다.

    USE [YourDatabaseName]
    GO
    
    /****** Object:  UserDefinedFunction [dbo].[ConvertUTCtoEastern]    Script Date: 11/2/2016 5:21:52 PM ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    CREATE FUNCTION [dbo].[ConvertUTCtoEastern]
    (
    @dtStartDate DATETIME
    )
    RETURNS DATETIME
    AS
    BEGIN
    DECLARE @Working DATETIME
    DECLARE @Returned DATETIME
    
    SET @Working = @dtStartDate
    SET @Working = 
    case when month(@Working) between 4 and 10 then dateadd(HH,-4,@Working) 
         when @Working between '2017-03-12' and '2017-11-05' then dateadd(HH,-4,@Working) 
         when @Working between '2016-03-13' and '2016-11-06' then dateadd(HH,-4,@Working) 
         when @Working between '2015-03-08' and '2015-11-01' then dateadd(HH,-4,@Working) 
         when @Working between '2014-03-09' and '2014-11-02' then dateadd(HH,-4,@Working) 
         when @Working between '2013-03-10' and '2013-11-03' then dateadd(HH,-4,@Working) 
         when @Working between '2012-03-11' and '2012-11-04' then dateadd(HH,-4,@Working) 
    else dateadd(HH,-5,@Working) end
    
    SET @Returned = @Working
    
    RETURN @Returned
    
    END
    
    
    GO
    
  18. ==============================

    18.이 DST와 서버 시간을 얻을 수 있어야합니다

    이 DST와 서버 시간을 얻을 수 있어야합니다

    declare @dt datetime
    set @dt = getutcdate() -- GMT equivalent
    

    sysdatetimeoffset 계정으로 DST 소요

    select [InputTime] = @dt
           , [LocalTime2] = dateadd(mi, datediff(mi, sysdatetimeoffset(),getdate()), @dt) 
    
  19. ==============================

    19.첫 번째 함수 : 이탈리아어 시간대 (+1, +2), 스위치 날짜를 설정 : 2011 년 3 월, 10 월의 마지막 일요일은 현재 시간대와 같은 날짜 매개 변수 사이의 차이를 리턴한다.

    첫 번째 함수 : 이탈리아어 시간대 (+1, +2), 스위치 날짜를 설정 : 2011 년 3 월, 10 월의 마지막 일요일은 현재 시간대와 같은 날짜 매개 변수 사이의 차이를 리턴한다.

    Returns:
    current timezone < parameter timezone ==> +1
    current timezone > parameter timezone ==> -1
    else 0
    

    코드는 다음과 같습니다

    CREATE FUNCTION [dbo].[UF_ADJUST_OFFSET]
    (
        @dt_utc datetime2(7)
    )
    RETURNS INT
    AS
    BEGIN
    
    
    declare @month int,
            @year int,
            @current_offset int,
            @offset_since int,
            @offset int,
            @yearmonth varchar(8),
            @changeoffsetdate datetime2(7)
    
    declare @lastweek table(giorno datetime2(7))
    
    select @current_offset = DATEDIFF(hh, GETUTCDATE(), GETDATE())
    
    select @month = datepart(month, @dt_utc)
    
    if @month < 3 or @month > 10 Begin Set @offset_since = 1 Goto JMP End
    
    if @month > 3 and @month < 10 Begin Set @offset_since = 2 Goto JMP End
    
    --If i'm here is march or october
    select @year = datepart(yyyy, @dt_utc)
    
    if @month = 3
    Begin
    
    Set @yearmonth = cast(@year as varchar) + '-03-'
    
    Insert Into @lastweek Values(@yearmonth + '31 03:00:00.000000'),(@yearmonth + '30 03:00:00.000000'),(@yearmonth + '29 03:00:00.000000'),(@yearmonth + '28 03:00:00.000000'),
                             (@yearmonth + '27 03:00:00.000000'),(@yearmonth + '26 03:00:00.000000'),(@yearmonth + '25 03:00:00.000000')
    
    --Last week of march
    Select @changeoffsetdate = giorno From @lastweek Where  datepart(weekday, giorno) = 1
    
        if @dt_utc < @changeoffsetdate 
        Begin 
            Set @offset_since = 1 
        End Else Begin
            Set @offset_since = 2
        End
    End
    
    if @month = 10
    Begin
    
    Set @yearmonth = cast(@year as varchar) + '-10-'
    
    Insert Into @lastweek Values(@yearmonth + '31 03:00:00.000000'),(@yearmonth + '30 03:00:00.000000'),(@yearmonth + '29 03:00:00.000000'),(@yearmonth + '28 03:00:00.000000'),
                             (@yearmonth + '27 03:00:00.000000'),(@yearmonth + '26 03:00:00.000000'),(@yearmonth + '25 03:00:00.000000')
    
    --Last week of october
    Select @changeoffsetdate = giorno From @lastweek Where  datepart(weekday, giorno) = 1
    
        if @dt_utc > @changeoffsetdate 
        Begin 
            Set @offset_since = 1 
        End Else Begin
            Set @offset_since = 2
        End
    End
    
    JMP:
    
    if @current_offset < @offset_since Begin
        Set @offset = 1
    End Else if @current_offset > @offset_since Set @offset = -1 Else Set @offset = 0
    
    Return @offset
    
    END
    

    그런 기능이 변환 날짜

    CREATE FUNCTION [dbo].[UF_CONVERT]
    (
        @dt_utc datetime2(7)
    )
    RETURNS datetime
    AS
    BEGIN
    
        declare @offset int
    
    
        Select @offset = dbo.UF_ADJUST_OFFSET(@dt_utc)
    
        if @dt_utc >= '9999-12-31 22:59:59.9999999'
            set @dt_utc = '9999-12-31 23:59:59.9999999'
        Else
            set @dt_utc = (SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), @dt_utc) )
    
        if @offset <> 0
            Set @dt_utc = dateadd(hh, @offset, @dt_utc)
    
        RETURN @dt_utc
    
    END
    
  20. ==============================

    20.- UTC에서 인도 표준 시간을 얻을

    - UTC에서 인도 표준 시간을 얻을

    CREATE FUNCTION dbo.getISTTime
    (
    @UTCDate datetime
    )
    RETURNS datetime
    AS
    BEGIN
    
        RETURN dateadd(minute,330,@UTCDate)
    
    END
    GO
    
  21. ==============================

    21.이것은 함수없이 수행 할 수 있습니다. 코드는 다음과 일광 절약에 대한 회계 산 시간에 UTC 시간을 변환합니다. 모두가 -6 -7 시간대에 숫자가 따라 (즉 EST를 위해 당신이 -4 조정 것 -5 각각) 조정

    이것은 함수없이 수행 할 수 있습니다. 코드는 다음과 일광 절약에 대한 회계 산 시간에 UTC 시간을 변환합니다. 모두가 -6 -7 시간대에 숫자가 따라 (즉 EST를 위해 당신이 -4 조정 것 -5 각각) 조정

    --Adjust a UTC value, in the example the UTC field is identified as UTC.Field, to account for daylight savings time when converting out of UTC to Mountain time.
    CASE
        --When it's between March and November, it is summer time which is -6 from UTC
        WHEN MONTH ( UTC.Field ) > 3 AND MONTH ( UTC.Field ) < 11 
            THEN DATEADD ( HOUR , -6 , UTC.Field )
        --When its March and the day is greater than the 14, you know it's summer (-6)
        WHEN MONTH ( UTC.Field ) = 3
            AND DATEPART ( DAY , UTC.Field ) >= 14 
            THEN
                --However, if UTC is before 9am on that Sunday, then it's before 2am Mountain which means it's still Winter daylight time.
                CASE 
                    WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 
                        AND UTC.Field < '9:00'
                        --Before 2am mountain time so it's winter, -7 hours for Winter daylight time
                        THEN DATEADD ( HOUR , -7 , UTC.Field )
                    --Otherwise -6 because it'll be after 2am making it Summer daylight time
                    ELSE DATEADD ( HOUR , -6 , UTC.Field )
                END
        WHEN MONTH ( UTC.Field ) = 3
            AND ( DATEPART ( WEEKDAY , UTC.Field ) + 7 ) <= DATEPART ( day , UTC.Field ) 
            THEN 
                --According to the date, it's moved onto Summer daylight, but we need to account for the hours leading up to 2am if it's Sunday
                CASE 
                    WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 
                        AND UTC.Field < '9:00'
                        --Before 9am UTC is before 2am Mountain so it's winter Daylight, -7 hours
                        THEN DATEADD ( HOUR , -7 , UTC.Field )
                    --Otherwise, it's summer daylight, -6 hours
                    ELSE DATEADD ( HOUR , -6 , UTC.Field )
                END
        --When it's November and the weekday is greater than the calendar date, it's still Summer so -6 from the time
        WHEN MONTH ( UTC.Field ) = 11
            AND DATEPART ( WEEKDAY , UTC.Field ) > DATEPART ( DAY , UTC.Field ) 
            THEN DATEADD ( HOUR , -6 , UTC.Field )
        WHEN MONTH ( UTC.Field ) = 11
            AND DATEPART ( WEEKDAY , UTC.Field ) <= DATEPART ( DAY , UTC.Field ) 
                --If the weekday is less than or equal to the calendar day it's Winter daylight but we need to account for the hours leading up to 2am.
                CASE 
                    WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 
                        AND UTC.Field < '8:00'
                        --If it's before 8am UTC and it's Sunday in the logic outlined, then it's still Summer daylight, -6 hours
                        THEN DATEADD ( HOUR , -6 , UTC.Field )
                    --Otherwise, adjust for Winter daylight at -7
                    ELSE DATEADD ( HOUR , -7 , UTC.Field )
                END
        --If the date doesn't fall into any of the above logic, it's Winter daylight, -7
        ELSE
            DATEADD ( HOUR , -7 , UTC.Field )
    END
    
  22. ==============================

    22.당신은 정확한 시간에 변환뿐만 아니라 문자열을 포맷해야합니다. 이 경우에 나는 줄루 시간을 필요로했다.

    당신은 정확한 시간에 변환뿐만 아니라 문자열을 포맷해야합니다. 이 경우에 나는 줄루 시간을 필요로했다.

    Declare @Date datetime;
    Declare @DateString varchar(50);
    set @Date = GETDATE(); 
    declare @ZuluTime datetime;
    
    Declare @DateFrom varchar (50);
    Declare @DateTo varchar (50);
    set @ZuluTime = DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), @Date);
    set @DateString =  FORMAT(@ZuluTime, 'yyyy-MM-ddThh:mm:ssZ', 'en-US' )  
    select @DateString;
    
  23. ==============================

    23.오라클을위한 가장 좋은 방법은 :

    오라클을위한 가장 좋은 방법은 :

    하드 코딩 된 날짜와 :

    SELECT TO_CHAR(CAST((FROM_TZ(CAST(TO_DATE('2018-10-27 21:00', 'YYYY-MM-DD HH24:MI') AS TIMESTAMP), 'UTC') AT  TIME ZONE 'EET') AS DATE), 'YYYY-MM-DD HH24:MI') UTC_TO_EET FROM DUAL
    

    결과: 2018년 10월 28일 0시

    열 및 테이블 이름 :

    SELECT TO_CHAR(CAST((FROM_TZ(CAST(COLUMN_NAME AS TIMESTAMP), 'UTC') AT  TIME ZONE 'EET') AS DATE), 'YYYY-MM-DD HH24:MI') UTC_TO_EET FROM TABLE_NAME
    
  24. ==============================

    24.나는이 같은 변환 사용하여 코드를 할 수 있습니다 UTC 시간을 로컬 및 지역에 UTC을 수행하는 코드가

    나는이 같은 변환 사용하여 코드를 할 수 있습니다 UTC 시간을 로컬 및 지역에 UTC을 수행하는 코드가

    DECLARE @usersTimezone VARCHAR(32)='Europe/London'
    DECLARE @utcDT DATETIME=GetUTCDate()
    DECLARE @userDT DATETIME=[dbo].[funcUTCtoLocal](@utcDT, @usersTimezone)
    

    DECLARE @usersTimezone VARCHAR(32)='Europe/London'
    DECLARE @userDT DATETIME=GetDate()
    DECLARE @utcDT DATETIME=[dbo].[funcLocaltoUTC](@userDT, @usersTimezone)
    

    기능은 NodaTime에서 제공하는 모든 또는 IANA / TZDB의 시간대의 일부를 지원할 수 - https://nodatime.org/TimeZones에서 전체 목록을 볼

    내 유스 케이스 수단이 난 단지 지금부터 5 +/-에 대한 년의 범위 내에서 시대의 전환을 허용하는 '현재'창을 필요로주의하십시오. 당신이 그것으로 인해 지정된 날짜 범위에있는 각 시간대 간격에 대한 코드를 생성하는 방식, 시간의 매우 넓은 기간을 필요로하는 경우이 방법은 아마 사용하신 것으로이 방법은 적합하지 않습니다.

    이 프로젝트는 GitHub의에 : https://github.com/elliveny/SQLServerTimeConversion

    이것은이 예에 따라 SQL 함수 코드를 생성

  25. ==============================

    25.다음은 계정에 DST 소요 그 하나 간단합니다

    다음은 계정에 DST 소요 그 하나 간단합니다

    CREATE FUNCTION [dbo].[UtcToLocal] 
    (
        @p_utcDatetime DATETIME 
    )
    RETURNS DATETIME
    AS
    BEGIN
        RETURN DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), @p_utcDatetime), GETDATE())
    END
    
  26. from https://stackoverflow.com/questions/8038744/convert-datetime-column-from-utc-to-local-time-in-select-statement by cc-by-sa and MIT license