2009-01-22 114 views
6

我想知道什麼是解析DateTime對象到您的SQL服務器的最佳方法。解析DateTime到SQL服務器的最佳方法

您在代碼中生成SQL的位置。

我總是使用類似DateTime.Now.TolongDateString()的東西,並取得了良好的效果,除了今天我得到了一個錯誤,它讓我覺得。

System.Data.SqlClient.SqlException: Conversion failed when converting datetime from character string 

那麼,什麼是每個人的想法和recomendations一種方式,將工作acrss所有SQL Server無論什麼有設置..

也許像DateTime.Now.ToString("yyyy/MM/dd")

+0

我現在一直在使用.ToString(「yyyy-MM-dd HH:mm:ss:fff」),它的接縫工作正常 – TheAlbear 2009-10-16 15:28:49

回答

14

只有2個安全格式

ISO和ISO8601

ISO = YYMMDD

ISO8601 = YYYY-MM-DD THH:MM: ss:mmm(無空格)(注意T)

這裏也請參見:Setting a standard DateFormat for SQL Server

+0

我很擔心這是不正確的數據庫甚至字符串'1997-12-09'都可以視爲12月9日或9月12日,具體取決於數據庫設置。所以你不能保證你傳遞給數據庫的字符串是如何處理的,除非你指定了格式。 – kristof 2009-01-22 15:32:16

1

格式化使用則DateTime.ToString(」 yyyy-MM-dd HH:mm:ss:fff「)將與MS SQL Server日期/時間格式匹配。 (我相信SQL Server對識別稍微不同的格式(例如斜槓)相當「智能」,但我個人成功地使用了該格式。)

編輯:正如註釋者所指出的,這可能會被破壞一些地區。

+0

這一個將失敗ydm語言環境 – 2009-01-22 14:58:57

3

這一個永遠不會失敗: DateTime.Now.ToString(「YYYYMMDD HH:MM:SS.FFF」)

10

爲什麼不參數化查詢和傳遞日期時間值作爲SQL日期時間輸入參數?

e.g INSERT INTO SomeTable (Blah, MyDateTime) VALUES (1, @MyDateTime)

然後你就可以十分肯定。即使你生成的SQL你應該能夠具體處理這個?

3

注意日期是否爲DateTime.Min,因爲SQL Server本身使用1700秒作爲開始時間。我會使用ISO日期時間格式:DateTime.ToString(「s」),但我還沒有嘗試過非西方安裝。

例如

DateTime.Now.ToString("c") 

insert into testtable values ('2009-01-22T15:08:13') 
5

你真的應該使用該參數化查詢,並通過您的的DateTime對象作爲SQL日期時間參數。

如果您解析日期時間字符串你將不得不同時面對你的應用服務器作爲數據庫服務器上的本地化設置。這可能會導致一些令人討厭的驚喜,例如將日期視爲美國格式,並且例如英國在另一個。字符串9/12/2000可以是9月12日或9月12日。因此,在應用程序和數據庫之間交換時,請將數據保留在對象/類型中。

你會分析顯示的數據(GUI)時日期時間字符串將是唯一的一次。但是,在解析時應確保使用正確的本地化設置,以用戶期望的格式顯示它。

相同的原理適用於其他數據類型,例如float。該字符串表示形式取決於區域設置,我假設你不解析float字符串將它傳遞到數據庫時,爲什麼要使用DateTime

10

我發現需要這種特定的格式:

DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fff") 

注意外殼和沒有任何空間。 這是根據Robyn Page的通用方式。