TimeZone сдвигается с помощью TSQL - PullRequest
1 голос
/ 06 июля 2011

У меня есть входящие почасовые данные (за 5 лет) с временными метками, записанными в CST или EST.Я хочу сохранить это в своей базе данных по времени UTC.

Есть ли способ конвертировать CST / CDT / CPT или EST / EDT / EPT в UTC с использованием TSQL?

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

mИ рекомендую вам сохранить их как DATETIMEOFFSET, чтобы сохранить информацию о часовом поясе.

Если вам нужно отобразить в качестве даты UTC, вы можете использовать SWITCHOFFSET

1 голос
/ 06 июля 2011

Вы можете определить дату и время в строке в EST или EDT:

С 2007 года местное время меняется в 02:00 EST на 03:00 EDT во второе воскресенье марта.и возвращается в 02:00 по восточному поясному времени в 01:00 по восточному поясному времени в первое воскресенье ноября, в США, а также в Канаде .

Затем применяется DATEADD()

Мб мой исходный код лучше объясняет, что я имею в виду:

declare @t table(dt datetime)

insert @t values ('2011-07-06T10:00:00'), ('2011-01-01T00:00:00'), ('2011-03-12T00:00:00'),
    ('2006-07-06T10:00:00')

select b.dt
    , CASE
        WHEN b.dt between b.[edt_start] and [edt_end] 
            THEN DATEADD(HH, -5, b.dt)
        ELSE DATEADD(HH, -4, b.dt)
    END

    , CASE
        WHEN b.dt between b.[edt_start] and [edt_end] 
            THEN '-05:00'
        ELSE '-04:00'
    END

from
(
    select a.dt
        , DATEADD(HH, 2, CASE 
            WHEN DATEPART(WEEKDAY, a.march) = 1 
                THEN a.march 
            ELSE DATEADD(DAY, 15 - DATEPART(WEEKDAY, a.march), a.march) 
        END) [edt_start]

        , DATEADD(HH, 2, CASE 
            WHEN DATEPART(WEEKDAY, a.november) = 1 
                THEN a.march 
            ELSE DATEADD(DAY, 8 - DATEPART(WEEKDAY, a.november), a.november) 
        END) [edt_end]
    from
    (
        select t.dt
            , YEAR(t.dt) [year]
            , CAST(CAST(YEAR(t.dt) as varchar(4)) + '03' + '01' as datetime) [march]
            , CAST(CAST(YEAR(t.dt) as varchar(4)) + '11' + '01' as datetime) [november]
        from @t t
    )a
)b
...