У меня есть старая таблица с несколькими строками, которая имеет столбец даты и времени. Я хочу переключить это на datetimeoffset, но я хочу смочь передать данные, которые уже существуют. Таким образом, я делаю что-то как:
SET IDENTITY_INSERT Table_Temp ON
INSERT INTO Table_Temp
(Col0, ... ColN,)
SELECT
COl0,.... ColN, from
Table_Original;
SET IDENTITY_INSERT Table_Temp OFF
Это работает, но набор смещения 0, когда я делаю dattime к datetimeoffset присвоению. К счастью, смещение, на которое я хочу установить его, является смещением существующей системы. Я не tsql гуру, но я, может казаться, не выясняю простой способ сделать это.
Я хочу смочь установить смещение в преобразовании. Я собирался обратиться к выполнению c# утилиты (или PowerShell), но я скорее сохраню это простым.
]Смотрите ниже для doc, вы, вероятно, хотите что-то вроде:[
] [-- up here set the @time_zone variable.
INSERT INTO Table_Temp
(Col0, ... ColN,)
SELECT
COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from
Table_Original;
]
[]Из []MSDN[][
] [] []]Функция SWITCHOFFSET настраивает введите значение DATETIMEOFFSET в параметр указанный часовой пояс при сохранении значение UTC. Синтаксис SWITCHOFFSET(datetimeoffset_value, time_zone). Например, следующее код корректирует текущую систему значение смещения даты по часовому поясу по Гринвичу +05:00:[
] []ВЫБЕРИТЕ SWITCHOFFSET(SYSDATETIMEOFFSET(), "-05:00");[
] []Итак, если текущая система значение смещения даты 12 февраля, 2009 10:00:00.0000000 -08:00, это код возвращает значение 12 февраля, 2009 13:00:00.0000000 -05:00.[
] []Функция TODATETIMEOFFSET устанавливает параметр смещение часового пояса от входной даты и значение времени. Его синтаксис TODATETIMEOFFSET(date_and_time_value), time_zone).[
] []Эта функция отличается от SWITCHOFFSET несколькими способами. Первый, не ограничивается значение смещения даты как входное; скорее он принимает любые данные о дате и времени шрифт. Во-вторых, он не пытается корректировать время в зависимости от часового пояса исходное значение и указанный часовой пояс, но вместо этого просто возвращает дату ввода и значение времени с заданным временем зона в качестве значения смещения даты.[
] []Главная цель Функция TODATETIMEOFFSET заключается в том, чтобы конвертировать типы, не являющиеся часовым поясом осведомленный о ДАТИМЕОФОРМАЦИОННОМ УСТАНОВЛЕНИИ по данным смещение часового пояса. Если указанная дата а значение времени - ДАТИМИРОВАНИЕ, изменение функции TODATETIMEOFFSET значение DATETIMEOFFSET, основанное на те же самые оригинальные местные дата и время значение плюс новый заданный часовой пояс смещение.[
] []Например, текущая система значение смещения даты 12 февраля, 2009 10:00:00.0000000 -08:00, и ты запустите следующий код:[
] []SELECT TODATETIMEOFFSET(SYSDATETIMEOFFSET(), "-05:00");[
] []Значение 12 февраля 2009 г. 10:00:00.0000000 -05:00 возвращается. Помните, что SWITCHOFFSET функция вернулась 12 февраля 2009 года 13:00:00.0000000 -05:00, потому что это корректировка времени в зависимости от времени зональные различия между входными данными (-08:00) и указанный часовой пояс. (-05:00).[
] []Как упоминалось ранее, вы можете использовать Функция TODATETIMEOFFSET с любой тип данных о дате и времени в качестве входных. Для Например, следующий код берет текущая системная дата и время и возвращает его в качестве значения смещения по дате с часовым поясом -00:05:[
] []SELECT TODATETIMEOFFSET(SYSDATETIME(), '-05:00');[
] [
Вы можете выяснить смещение текущего SQL сервера, используя следующее.
select datediff(MI,getdate(), getutcdate())
Вам нужно получить смещение в минутах, а не в часах, так как существует несколько получасовых и даже четверть-часовых часовых поясов.
Используя значение минуты, вы можете изменить входящие значения (предполагая, что исторически все они были записаны как местное время), используя что-то вроде
select dateadd(mi,datediff(MI,getdate(), getutcdate()), yourDateField)
Для эффективности я бы вычислил их один раз в переменную и использовал бы это, так как разница не изменится.