2009-01-22 49 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的通用方式。