2013-12-13 47 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,但目前無法獲得o/p。

任何幫助

回答

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); 

您需要更正偏移表中的數據,並且需要更改使用輸出的方式。就我個人而言,我發現遠離DATETIMEOFFSETSWITCHOFFSET()更容易,尤其是因爲它們不支持DST。我有更好的運氣,使用偏移日曆表,在幾分鐘內存儲偏移量,並使用DATEADD在時區之間切換。因人而異。

+0

是的正確我錯過了。以上截斷我的數據,並只顯示「 - 」 – Sks

+0

完成,我忘了默認varchar大小爲1 – Sks

+0

感謝艾隆的提醒 – Sks