2017-01-04 5 views
0

Возможно ли в SQL Server Query преобразовать datetimeoffset в соответствующий часовой пояс? Например, я значения хранятся в виде:Преобразование SQL Server DateTimeOffset в часовой пояс

2015-01-03 00:30 -06: 00

2015-01-10 00:30 -05: 00

Я хочу, чтобы мой SQL запрос для отображения -06: 00 как CST или CDT и -05: 00 как EST или EDT, если действует летнее сбережение.

Я кодирования RSS Feed где я в конечном счете хочу, чтобы мой столбец результирующего набора данных на дисплей:

Пт, 2 января 2015 18:30 CST

Пт, 9 января 2015 18:30 EST

Любая помощь будет принята с благодарностью. Благодаря!

+1

Почему -06: 00 CST? Это может быть любой из допустимых временных зон. Вы хотите только часовые пояса США? Вы можете использовать DATEPART (TZoffest, YourDate) и выражение case. –

+0

SQL Server не предоставляет встроенной функции, которая возвращает имя часового пояса DateTimeOffset. Вам нужно либо создать такую ​​функцию, либо сделать форматирование в приложении-потребителе. – wdosanjos

+0

@wdosanjos это не требует функции. Если есть только часовые пояса США, простое выражение случая может справиться с этим легко. –

ответ

0

Вот пример того, как вы можете это сделать, используя DATEPART. Если вам нужно больше часовых поясов, вам может потребоваться использовать таблицу поиска и присоединиться к значению DATEPART. Имейте в виду, что для каждого смещения существует несколько временных интервалов. Они будут варьироваться в зависимости от широты.

create table #TimeZoneExample 
(
    MyDateTimeOffset datetimeoffset 
) 

insert #TimeZoneExample 
select '2015-01-03 00:30 -06:00' union all 
select '2015-01-10 00:30 -05:00' 

select convert(datetime, MyDateTimeOffset) as PostDate 
    , case DATEPART(TZoffset, MyDateTimeOffset)/60 
     when -5 then 'EST' 
     when -6 then 'CST' 
     when -7 then 'MST' 
     when -8 then 'PST' 
     else 'Unknown Time Zone' 
    end 
from #TimeZoneExample 

drop table #TimeZoneExample 
+1

К сожалению, это не учитывает летнее время. – wdosanjos

+0

Спасибо, г-н Ланге, за пример кода. – behofmann

+0

Хорошая точка @ wdosanjos, и, конечно, было бы почти невозможно сделать это даже близко, учитывая предоставленную примерную информацию, потому что не все местоположения/страны/государства используют летнее время. Вам нужно будет значительно расширить его, чтобы соответствовать международным временам, как это было предложено. И любой точный результат потребует гораздо большей информации, чем просто datetimeoffset. Вам также нужно знать местоположение, чтобы вы могли точно определить время. Не уверен, что здесь требуется 100%, но, безусловно, стоит упомянуть. –

0

Когда мне пришлось работать над этим, я понял, что единственный вариант, который действительно работает, чтобы сохранить все даты/время как UTC, и включать в себя индикатор часового пояса, который привязывает к столу, показывающий, когда любые изменения часового пояса , например, летнее время. Для этого вам потребуется специальный код.

К счастью, кто-то ведет базу данных данных о часовом поясе, включая переходы DST и т. П. - IANA Time Zone DB. Вы можете сами использовать и обновлять необработанные данные или искать другие примеры того, как это сделать, включая SQL Server Timezone Support Project на GitHub.

В конце концов, UTC, Часовой пояс и база данных конверсий - это единственный способ обеспечить идеальную точность и конвертируемость времени между часовыми поясами - особенно те редкие TZ, которые составляют 15 минут или 1/2 часа с UTC.

Смежные вопросы