Переместите столбец SQL Server DateTime в DateTimeOffset

У меня есть старая таблица с несколькими строками, которая имеет столбец даты и времени. Я хочу переключить это на 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), но я скорее сохраню это простым.

22
задан David Gardiner 13 April 2015 в 23:54
поделиться

2 ответа

[

]Смотрите ниже для 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');[

] [
]
22
ответ дан 29 November 2019 в 05:07
поделиться

Вы можете выяснить смещение текущего SQL сервера, используя следующее.

select datediff(MI,getdate(), getutcdate())

Вам нужно получить смещение в минутах, а не в часах, так как существует несколько получасовых и даже четверть-часовых часовых поясов.

Используя значение минуты, вы можете изменить входящие значения (предполагая, что исторически все они были записаны как местное время), используя что-то вроде

select dateadd(mi,datediff(MI,getdate(), getutcdate()), yourDateField)

Для эффективности я бы вычислил их один раз в переменную и использовал бы это, так как разница не изменится.

2
ответ дан 29 November 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: