복붙노트

[SQL] 나는 날짜 시간으로는 SQL 서버 2008 DateTimeOffset으로 변환 할 수있는 방법

SQL

나는 날짜 시간으로는 SQL 서버 2008 DateTimeOffset으로 변환 할 수있는 방법

나는 DATETIME 필드까지하는 DATETIMEOFFSET 필드가하지만 오프셋의 통지를 복용하여 시간을 다시 계산 테이블을 변환 할 바라고 있어요. 이것은 사실상 값을 UTC로 변환합니다.

예를 들면.

CreatedOn: 2008-12-19 17:30:09.0000000 +11:00

그는로 변환 얻을 것이다

CreatedOn: 2008-12-19 06:30:09.0000000

또는

CreatedOn: 2008-12-19 06:30:09.0000000 + 00:00 -- that's a `DATETIMEOFFSET`, but `UTC`.

건배 :)

해결법

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

    1.거의 모든 스타일을 사용하여 변환하면 DATETIME2 값이 UTC로 변환됩니다. 또한, DATETIME2에서 DATETIMEOFFSET로 변환은 단순히 +00 오프셋을 설정합니다 (! 오프셋 = 0)가 DATETIMEOFFSET 변환하는 빠른 방법은, 그래서, 아래의 당, 00 DATETIMEOFFSET에 (+00 : 00)

    거의 모든 스타일을 사용하여 변환하면 DATETIME2 값이 UTC로 변환됩니다. 또한, DATETIME2에서 DATETIMEOFFSET로 변환은 단순히 +00 오프셋을 설정합니다 (! 오프셋 = 0)가 DATETIMEOFFSET 변환하는 빠른 방법은, 그래서, 아래의 당, 00 DATETIMEOFFSET에 (+00 : 00)

    declare @createdon datetimeoffset
    set @createdon = '2008-12-19 17:30:09.1234567 +11:00'
    
    select CONVERT(datetime2, @createdon, 1)
    --Output: 2008-12-19 06:30:09.12
    
    select convert(datetimeoffset,CONVERT(datetime2, @createdon, 1))
    --Output: 2008-12-19 06:30:09.1234567 +00:00
    
  2. ==============================

    2.나는이 SQL 옵션 내장 사용하십시오 :

    나는이 SQL 옵션 내장 사용하십시오 :

    select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
    
  3. ==============================

    3.난 당신이 날짜 시간에 DateTimeOffset으로 변환하려는 경우, 당신이 계정에 당신이 변환하는 서버의 시간대를 취할 필요가 있다고 생각이 오래된 질문은 알고 있지만. 당신은 단지 CONVERT를 할 경우 (날짜, @MyDate, 1) 당신은 단순히 잘못된 변환 시간대, 가능성이 결과를 잃게됩니다.

    난 당신이 날짜 시간에 DateTimeOffset으로 변환하려는 경우, 당신이 계정에 당신이 변환하는 서버의 시간대를 취할 필요가 있다고 생각이 오래된 질문은 알고 있지만. 당신은 단지 CONVERT를 할 경우 (날짜, @MyDate, 1) 당신은 단순히 잘못된 변환 시간대, 가능성이 결과를 잃게됩니다.

    나는 당신에게 그런 다음, 상기하는 DateTimeOffset 값의 오프셋 (offset) 스위치 변환을 수행하는 최초의 필요성을 생각합니다.

    DECLARE @MyDate DATETIMEOFFSET = '2013-11-21 00:00:00.0000000 -00:00';
    SELECT CONVERT(DATETIME, SWITCHOFFSET(@MyDate, DATEPART(tz,SYSDATETIMEOFFSET())));
    

    변환의 결과는 ': 00 : 00 2013년 11월 21일 00.0000000 -00 : 00 날짜 시간 오프셋에있어 서버에있다 -7 : 00 : 00.000 00 17 2013년 11월 20일 것이다. 위의 논리로는하지 않습니다 이잖아요 시간 서버의 영역 또는 날짜 시간 값의 오프셋 (offset)는,이 서버 시간대에서 날짜 시간으로 변환됩니다 것.

    난 당신이 날짜 시간 값이 값은 서버의 시간대에 있다고 가정 포함되어 있기 때문에이 작업을 수행 할 필요가 생각합니다.

  4. ==============================

    4.참고 : 스타일 ( "126"여기가) 지정되지 않은 경우 시간대 정보는 변환에 삭제됩니다. 그것은 또한 다른 스타일의 일부 폐기 될 수있다, 나도 몰라 않음 - TZ 정보는 어떤 경우에 제대로 다음 조정합니다. CAST 및 CONVERT를 참조하십시오.

    참고 : 스타일 ( "126"여기가) 지정되지 않은 경우 시간대 정보는 변환에 삭제됩니다. 그것은 또한 다른 스타일의 일부 폐기 될 수있다, 나도 몰라 않음 - TZ 정보는 어떤 경우에 제대로 다음 조정합니다. CAST 및 CONVERT를 참조하십시오.

    select convert(datetime, cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset), 126) as utc;
    

    해피 SQL'ing.

    편집하다

    확실하지가 중요하지만 경우 ... 날짜는 실제로 정밀도 / 정확도의 수준을 저장할 수 없습니다. 위의 실행되면 소수 초는 3 자리 숫자로 잘립니다 (과 정확성이 적은보다)입니다. DATETIME2와 동일 같은 (그리고 DATETIMEOFFSET (7))은 비 절단 값을 생성한다 :

    select convert(datetime2, cast('2008-12-19 17:30:09.1234567 +11:00' as datetimeoffset(7)), 126) as utc;
    
  5. ==============================

    5.일광 절약 시간의 계정을 위해, 나는 다음을 사용 :

    일광 절약 시간의 계정을 위해, 나는 다음을 사용 :

    CONVERT(
      DateTime, 
      SWITCHOFFSET(
        CONVERT(
          DateTimeOffset, 
          CONVERT(
            DateTime, 
            [time_stamp_end_of_interval], 
            120
          )
        ),
        DATENAME(
          TzOffset, 
          CONVERT(
            DateTime, 
            [time_stamp_end_of_interval], 
            120
          ) AT TIME ZONE 'Pacific Standard Time'
        )
      )
    )
    AS GOOD_PST
    

    참고 : time_stamp_end_of_interval은 VARCHAR입니다

  6. from https://stackoverflow.com/questions/4953903/how-can-i-convert-a-sql-server-2008-datetimeoffset-to-a-datetime by cc-by-sa and MIT license