2012-12-28 40 views
8

我總是在日期時間使用此代碼轉換:SQL服務器的轉換問題與日期時間

DECLARE @a datetime 
SET @a= CONVERT(datetime,'2012-12-28 14:04:43') 
print @a 

但這不工作了!我甚至試圖重新啓動SQL服務器,但問題仍然存在:

Conversion error

圖像中的錯誤是在意大利。在英語中應該是:

一個char數據類型爲日期時間的轉換導致日期時間 值超出允許值的範圍內。

+0

您最近是否將您登錄的默認語言更改爲意大利語?這會影響'DATEFORMAT'以及如何解析日期。如果你做'SET LANGUAGE english',你的代碼可以正常工作,但是在'SET LANGUAGE italian'下無法正常工作。 –

回答

15

SQL Server支持多種格式 - 請參閱MSDN Books Online on CAST and CONVERT。這些格式中的大多數是,依賴於,因此您可以設置哪些設置 - 因此,這些設置可能會工作一些 - 有時不會。

解決這個問題的方法是使用(稍作改動)ISO-8601日期由SQL Server支持的格式 - 這種格式的作品總是 - 不管你的SQL Server的語言和日期格式設置。

ISO-8601 format由SQL Server支持有兩種形式:

  • YYYYMMDD只是日期(沒有時間部分);請注意:沒有破折號!,這非常重要! YYYY-MM-DD不是獨立於您的SQL Server中的dateformat設置,並將在所有情況下工作!

或:

  • YYYY-MM-DDTHH:MM:SS的日期和時間 - 這裏需要注意:這種格式破折號(但他們可以可省略),並固定T的日期和時間之間的分隔符你的部分DATETIME

這對SQL Server 2000及更新版本有效。

如果你使用SQL Server 2008或更高版本和DATE數據類型(僅DATE - DATETIME!),那麼你確實也可以使用YYYY-MM-DD格式,並且可以使用SQL Server中的任何設置。

不要問我爲什麼這整個話題如此棘手,有點令人困惑 - 這就是它的方式。但使用YYYYMMDD格式,對於任何版本的SQL Server以及SQL Server中的任何語言和dateformat設置,都應該可以。

所以在你的具體案例 - 使用此:

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28T14:04:43') 
print @a 

,這應該任何 SQL Server安裝工作,具有任何語言和日期格式設置。

如果你運行你原來的美國英語代碼 - 它會工作得很好:

SET LANGUAGE English 

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a 

Dec 28 2012 2:04PM 

但如果您使用意大利語(或德國或英國,或者法語)爲您的語言,它會失敗因爲格式沒有的日期/時間字符串中間的T語言無關的,而不是「安全」:

SET LANGUAGE Italian 

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a 

Msg 242,Level 16,State 3,Line 4
在datetime ha generato un valore non compreso nell'intervallo dei valori consentiti中轉換的日期和時間。

4

您試圖將字符串轉換爲日期時間。問題在於日期部分。最好的方法是獲取日期字符串到ISO format (yyyymmdd)然後轉換。嘗試這個;

DECLARE @a datetime 
SET @a= CONVERT(datetime,replace('2012-12-28 14:04:43', '-','')) 
print @a 
+0

謝謝!這工作。但我不知道爲什麼我的代碼在我的朋友的電腦上工作。 – GVillani82

+0

這可能是他當地的文化背景。 – Kaf

0

我的猜測是在您的計算機上更改了默認的日期時間格式。添加轉換規範返回:

SET @a= CONVERT(datetime,'2012-12-28 14:04:43', 121)