2013-12-13 2 views
0

Запрос:Преобразовать значение времени zonoffset для VARCHAR

DECLARE @TimeZoneOffset datetimeoffset 
SELECT @TimeZoneOffset = Time_Zone_Offset 
FROM OFFSET_TABLE WHERE Active=1 

Time_Zone_Offset столбец содержит значение, например -6: 00 (только смещение)

Когда я SELECT @TimeZoneOffset он бросает мне ошибку

Ошибка конверсии при преобразовании даты и/или времени из символьной строки.

Я знаю, что делаю что-то неправильно. Мне может понадобиться CONVERT/CAST, но до сих пор он не может получить.

Любая помощь

ответ

1

Для того, чтобы визуализировать то, что происходит здесь, попробуйте следующее:

DECLARE @x VARCHAR; 
SET @x = 'abcdefghijklmnop'; 
SELECT @x; 

Результат:

---------- 
a 

You have silently lost data from your variable, because you didn't bother declaring a length for your VARCHAR. В вашем случае, я думаю, вы в конечном итоге пытаетесь использовать строку - где-то, в отличие от строки -6:00.

Я не уверен, как простой SELECT дал указанную вами ошибку; Я подозреваю, что вы используете его в каком-то другом контексте, который вы не показывали. Но попробуйте снова, как только ваша переменная будет объявлена ​​правильно.

Теперь я понимаю, почему ваш вопрос был неправильным - вы сказали, что переходите на VARCHAR, но вы не были. Это не является неожиданным, так как -6:00 недействителен DATETIMEOFFSET; ожидается, что датируют и времени компонентов, иначе тип данных будет называться OFFSET. Действительный DATETIMEOFFSET, согласно the documentation, является:

DECLARE @d DATETIMEOFFSET = '1998-09-20 7:45:50.71345 -05:00'; 

Так что, возможно у вас есть некоторые значения даты и времени, и вы хотите, чтобы применить смещение, а вы можете использовать SWITCHOFFSET() для этого. Однако -6:00 недействительное значение; он должен быть в формате [+/-]hh:mm (обратите внимание на ведущее 0 выше, которое, кажется, отсутствует в ваших данных образца). Так что это было бы справедливо:

DECLARE @datetime DATETIME = GETDATE(), @offset VARCHAR(6) = '-06:00'; 
SELECT SWITCHOFFSET(@datetime, @offset); 

Вам необходимо исправить данные в таблице смещений, и вы должны изменить способ вы используете выход. Лично мне было легче держаться подальше от DATETIMEOFFSET и SWITCHOFFSET(), тем более что они не знают DST. Мне повезло с использованием таблицы календаря для смещений, сохранения смещений за считанные минуты и использования DATEADD для переключения между часовыми поясами. YMMV.

+0

Да, правильно я пропустил. выше усекает мои данные и отображается только «-» – Sks

+0

Выполнено, я забыл, что по умолчанию размер varchar равен 1 – Sks

+0

Спасибо Aaaron за напоминание – Sks

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