2011-04-13 92 views
2

看來這個問題被問了很多,但沒有一個答案給了我結果。我在這裏拉我的頭髮...所以希望有人有答案。SQL日期格式日期和月份混合

我有一臺運行SQL Server 2005的生產服務器。我備份了數據庫,並將其恢復到筆記本電腦的SQL Server Express實例中。現在日期查詢受到嚴重影響。在刺激中。服務器全部存儲爲「4/13/2011 12:00:00 AM」格式,但在我的筆記本電腦上顯示爲「2011-04-14 00:00:00.000」。當我在「2011年4月14日」嘗試查找條目時發生查詢時,筆記本電腦給我提供了錯誤「將varchar數據類型轉換爲日期時間數據類型導致超出範圍值」。 編輯:這個確切的查詢在生產SQL服務器上運行良好。 (我使用SSMS運行查詢...不是應用程序/代碼)

我確定我的筆記本電腦的Windows區域設置與服務器(英語(美國))相同,並且區域和語言控制面板完全相同。

最後我跑了以下兩個查詢:

select name ,alias, dateformat 
    from syslanguages 
    where langid = 
     (select value from master..sysconfigures 
     where comment = 'default language') 

select @@language 

分別 「英國」 放棄 「*美國英語,英語,MDY *」 ......和的結果。這位英國人來自哪裏?!現在,當我在查詢之前(在管理工作室中)運行此命令時(在管理工作室中)

SET DATEFORMAT mdy 

然後,一切正常!但在syslanguages查詢中,它似乎已經是mdy格式。我不打算在整個地方用「SET DATEFORMAT」重寫我的應用程序 - 所以希望有人有線索。也許我的SQL Express安裝有誤,我必須重新安裝它?

我會繼續修補,希望能夠讓這個工作。

+0

不知道這是否是一個答案,但另一件事來檢查將是數據庫的區域設置,而不是服務器及其上做到這一點。可能已決定使用不同的「英文」來存儲數據。 – James 2011-04-13 21:59:02

+0

「當我做一個查詢試圖找到關於」你用什麼來做的? SSMS? – 2011-04-13 22:15:29

+0

你將如何檢查SQL服務器數據庫的區域設置?我可以更改排序規則,但我確定這不相關。 是的 - 我使用SSMS(快速版)來運行這些查詢。 – MikeMurko 2011-04-14 00:45:47

回答

2

這是您需要更改的登錄的語言設置。

您可以通過SSMS -> Security -> Logins -> YourLogin -> Properties -> Default Language

或者通過TSQL

ALTER LOGIN [YourLogin] WITH DEFAULT_LANGUAGE=[us_english] 
+0

是的,這是它。我只是想出了。我使用SSMS來改變它。愚蠢的StackOverflow不會讓我回答我自己的問題,因爲我沒有足夠的代表。 在SQL Server Management Studio中更改此方法的方法是轉到SQL Server實例根目錄中的「安全」文件夾 - >「登錄」 - >右鍵單擊某個用戶,然後單擊「屬性」 - >然後選擇「我」將「默認語言」設置爲「英語」。 Kaboom!感謝馬丁的幫助! – MikeMurko 2011-04-14 01:03:14

0

如果使用dd-mmm-yyyy格式指定東西,或者更好,請使用DateTime參數(而不是varchar輸入),則不會出現問題。

嘗試更改默認語言爲美國英語,使用下列內容:

EXEC sp_configure 'default language', 1033 
RECONFIGURE 

如果不工作,你可以嘗試語言代碼0

+0

我嘗試了代碼0,它只是從0更改爲0.對問題沒有影響。你的意思是dd-mmm-yyyy格式 - 不只是英國人嗎? 我無法使用參數,因爲我已經編寫了大量的遺留應用程序,所以我不想更改我的查詢 - 只需將我的SQL Server配置爲相同。 – MikeMurko 2011-04-14 00:47:50

+0

如果您將日期聲明爲'16 -Apr-2011'或'2011-04-16',那麼它是毫不含糊的,SQL服務器將始終做正確的事情。但實際上,你不應該將日期字符串連接到你的SQL中,你應該使用參數並傳遞類似的日期時間信息。 – 2011-04-14 07:38:25

0

你傳遞日期爲字符串文字 - 或者連接字符串以在應用程序中建立sql?

如果您正在這樣做,請考慮使用dateTime數據類型的參數。或者至少使用ODBC轉義子句轉義它們並將其格式化爲{ts'yyyy-mm-ddhh:mm:ss [.fff]'},例如:{ts'1998-09-24 10:02:20' }。

這很可能是您的應用程序未正確傳遞日期時間。

+0

應用程序中的Concat字符串。但我不認爲這是問題,因爲我直接將這些查詢運行到SQL Server Management Studio中。 我從來沒有見過這種逃避條款格式......我會更詳細地閱讀它。 – MikeMurko 2011-04-14 00:48:51