programing

SQL Server 2008 DateTimeOffset을 DateTime으로 변환하는 방법

lastcode 2023. 7. 16. 13:33
반응형

SQL Server 2008 DateTimeOffset을 DateTime으로 변환하는 방법

저는 테이블을 변환하고 싶습니다.DATETIMEOFFSET필드, a로 축소DATETIMEBUT 필드는 오프셋을 확인하여 시간을 재계산합니다.이는 사실상 값을 다음으로 변환합니다.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`.

건배 :)

거의 모든 스타일을 사용하여 변환하면 datetime2 값이 UTC로 변환됩니다.
또한 datetime2에서 datetimeoffset으로 변환하면 오프셋이 다음과 같이 설정됩니다.+00:00아래에 따라, 그래서 그것은 변환하는 빠른 방법입니다.Datetimeoffset(offset!=0)로.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

기본 제공 SQL 옵션을 사용합니다.

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

오래된 질문인 것은 알지만 DateTimeOffset을 DateTime으로 변환하려면 변환 중인 서버의 표준 시간대를 고려해야 합니다.변환(datetime, @MyDate, 1)만 수행하면 시간대가 손실되어 잘못된 변환이 발생할 수 있습니다.

먼저 DateTimeOffset 값의 오프셋을 전환한 후 변환을 해야 할 것 같습니다.

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

오프셋이 -7:00인 서버에서 '2013-11-2100:00:00.0000000-00:00'을 DateTime으로 변환한 결과는 2013-11-20 17:00:00.000이 됩니다.위의 논리에서는 서버의 표준 시간대나 DateTime 값의 오프셋이 중요하지 않습니다. 서버 표준 시간대에서 DateTime으로 변환됩니다.

DateTime 값에는 값이 서버의 표준 시간대에 있다는 가정이 포함되어 있기 때문에 이 작업이 필요하다고 생각합니다.

SQL Server의 DateTimeoffset(시간대) 변환입니다.

SQL Server 2016(13.x) 이상

예제

Select GETUTCDATE()
Select Convert(DATETIME, GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time')
Select Convert(DATETIME, GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time')

결과는 다음과 같습니다.

2020-08-18 08:22:21.640
2020-08-18 10:22:21.640
2020-08-18 13:52:21.640

참고: 스타일("126")이 지정되지 않은 경우 변환 시 시간대 정보가 삭제됩니다.또한 다른 스타일로 폐기될 수도 있습니다. 어떤 경우든 TZ 정보에 대해 다음과 같이 올바르게 조정됩니다.CASTCONVERT를 참조하십시오.

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

해피 SQL'ing.

편집

그게 중요한지는 모르겠지만...datetime 실제로 그 정도의 정밀도/정확도를 저장할 수 없습니다.위를 실행하면 분수 초수가 3자리로 잘립니다(정확도는 그보다 낮음).와 동일datetime2(및datetimeoffset(7)) 값이 아닌 값을 생성합니다.

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

는여가방법지에서 하는 몇 가지 DateTimeOffsetDateTime2(UTC 또는 로컬).

SQL Server 2019에서:

DECLARE @dto datetimeoffset = SYSDATETIMEOFFSET();

SELECT @dto as MyDateTimeOffset_EST                                -- 2023-05-24 15:04:59.1321648 -04:00
    ,@dto AT TIME ZONE 'UTC'     as DateTimeOffset_UTC             -- 2023-05-24 19:04:59.1321648 +00:00
    ,SWITCHOFFSET(@dto, 0)       as DateTimeOffset_UTC_also        -- 2023-05-24 19:04:59.1321648 +00:00
    ,CONVERT(datetime2, @dto AT TIME ZONE 'UTC') as DateTime2_Utc  -- 2023-05-24 19:04:59.1321648
    ,CONVERT(datetime2, @dto, 1) as DateTime2_Utc_also             -- 2023-05-24 19:04:59.1321648
    ,CONVERT(datetime2, @dto)    as DateTime2_Local                -- 2023-05-24 15:04:59.1321648
    -- If you want to change to a different time zone:
    ,@dto AT TIME ZONE 'UTC'
       AT TIME ZONE 'Pacific Standard Time' as DateTimeOffset_PST  -- 2023-05-24 12:04:59.1321648 -07:00

일광 절약 시간을 고려하기 위해 다음을 사용했습니다.

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는 바르샤르 .

언급URL : https://stackoverflow.com/questions/4953903/how-can-i-convert-a-sql-server-2008-datetimeoffset-to-a-datetime

반응형