2012-04-25 70 views
1

在一個新的服務器安裝應用程序後,它拋出了錯誤:奇怪的SQL錯誤:一個varchar爲datetime的轉換導致超出範圍的值

The conversion of a varchar data type to a datetime data type resulted in an 
out-of-range value. 

的應用程序正常工作在其他服務器上,所以我很困惑這個問題。被保存的值是

25/4/2012 1:18:01 PM 

這已經是正被保存到一個datetime列,所以我敢肯定有與數據庫和代碼本身沒有問題DateTime類型。問題嚴格是因爲服務器的設置?任何具體的原因和解決方案/解決方法?

+0

什麼是字段類型,以及如何訪問它? 「確定」代碼沒有問題聽起來爲時尚早...... – 2012-04-25 13:30:00

+1

是您的sql區域設置使用日期格式dd/mm/yyyy?或者mm/dd/yyyy? – 2012-04-25 13:30:40

+1

你說這是一個日期時間,被保存到一個日期時間列,但錯誤消息告訴我們,*在某個點*,它被轉換成一個字符串。你沒有顯示任何代碼,所以我們不能指出你導致問題的線路。在這一點上最好的猜測是你正在構造一個查詢字符串而不是使用參數。通常,您應該將日期時間*保留爲*日期時間,並依賴於ADO.Net用於在.NET概念和SQL概念之間執行任何必要的轉換,並避免將它們視爲字符串。 – 2012-04-25 13:31:35

回答

1

一種預防問題的方法。

如果您對包含日期的供稿內容有任何影響,那麼'Day#MonthName 4digityear'就是您想要的格式。無論區域設置如何,sql server中的啓發式都不會對'25APR2012'產生混淆。這是一個更強大的格式。它將在沒有麻煩的情況下跨越海洋。

否則,您必須使用轉換(日期時間,TheDateString,CorrectFormatNumber)

我覺得131可能會爲你工作。

哦,並回應一些評論,如果你可以防止這些數據採取字符串的形式,你應該。

+0

我還沒有測試過這個,但是什麼可能是它在其他機器上工作的原因,除了這個特定的我正在安裝它? – Bahamut 2012-04-25 14:09:56

+0

感謝您的處理日期的方法。 – Peter 2012-04-25 14:45:59

+0

不正確。 '設置語言Português;選擇CONVERT(datetime,'25apr2012')'給出錯誤。唯一安全的格式完全是數字。這也是再一次避免字符串的原因。安全的數字格式是'yyyymmdd'和'yyyy-mm-ddThh:MM:ss'(其中T是文字字母'T')。 – 2012-04-25 16:42:38

0

好的建議,但在我的情況下,我不能打擾通過數千行代碼。在安裝過程中重新安裝sql並設置區域設置是最快最省時的方式。

在將應用程序中的日期時間字符串保存到數據庫之前解析該日期時間字符串是給定的。

設置語言和dateformat只適用於當前查詢,並不適用於每個查詢。當然,更新代碼中的sql查詢是浪費時間,imo和我的情況。

1

您可以爲每個連接類的日期時間格式

SET DATEFORMAT DMY

此方法允許您使用日期格式發送到d/M/Y的SQL Server的日期,但它依賴於連接。如果與SQL Server建立了新連接,或者服務器停止並重新啓動,則日期格式將返回到m/d/y。

設定的格式永久

要在服務器上設置的語言,你必須使用sp_addlanguage將增加一種語言。 以下示例設置英式英語的語言,並以DD/MM/YY格式給出日期。該示例也可以應用於其他國家,但您可能需要修改sp_addlanguage的參數。

EXEC sp_addlanguage將 '英國', '英語', '一月,二月,三月,四月,五月,六月,七月,八月,九月,十月, 十一月,十二月', 「一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月」, 「週一,週二,週三,週四,週五,週六,週日, DMY,1個 sp_configure的 '默認語言',1 重新配置與覆蓋

瞭解更多信息

http://support.microsoft.com/kb/173907

相關問題