2015-05-16 56 views
0

目前正在使用下述代碼如何在SQL中相對於系統文化轉換日期?

CONVERT(DATETIME, "16-05-2015 21:27:25.280",105) 

使用這個它在我的系統文化工作和我們在英國的客戶之一。 但在我們的美國客戶面臨問題。

錯誤消息:

一個nvarchar數據類型爲datetime數據類型的轉換導致外的範圍內的值

所以有任何方式的字符串轉換爲DATETIME依賴於.net中的系統文化。

在此先感謝

Thejus電視

回答

1

的各種設置(語言,日期格式)僅影響如何DateTime向您顯示在SQL Server Management Studio中 - 或者它是如何解析的,當你試圖將字符串轉換爲DateTime

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設置,都應該可以。

如果您只需要日期部分,則SQL Server 2008及更新版本的建議是使用DATE;如果需要日期和時間,則建議使用DATETIME2(n)。如果可能,您應該嘗試開始逐步取消DATETIME數據類型

+0

「YYYYMMDD」不是** ISO格式。只有日期的ISO格式是'YYYY-MM-DD' –

+0

@a_horse_with_no_name:是的 - 理論上,你是對的 - 但是'YYYY-MM-DD'是***不是***獨立於SQL Server的語言 - 試試吧'SET LANGUAGE german SELECT CAST('2015-05-25'AS DATETIME)' - 這會導致**錯誤**!但是'SET LANGUAGE german SELECT CAST('20150525'AS DATETIME)'按預期工作(這僅適用於** DATETIME數據類型 - 使用DATE或DATETIME2(n)就好) –

+0

@marc_s在我的情況下,輸入日期時間因系統日期格式而異。有時它可能是dd-mm-yyyyy,有時可能是mm-dd-yyyy。 – thejustv