如何防止超出范围的日期时间值错误?

时间:2010-03-10 21:25:07

标签: c# sql-server sql-server-2005 tsql datetime

我正在将一个特殊的Insert语句从c#应用程序传递给sql server 2000/2005。有时候,如果机器(安装了sql server)的日期时间格式与我传入的格式不同,则会抛出错误。

e.g。 :在Insert语句中,我传递的是“2010-03-10 00:00:00-05:00”,但机器区域日期设置不同。我收到了这个错误: -

  

将char数据类型转换为   日期时间数据类型导致   超出范围的日期时间值。

我可以在c#的Insert语句中传递一些通用日期格式,它与任何机器的区域日期时间设置完美配合。?

2 个答案:

答案 0 :(得分:5)

“yyyymmdd”是最安全的,基本的ISO-8601格式。 “yyyy-mm-dd”存在问题,如下面提到的链接

随着时间的推移:“yyyymmdd ......:mm:ss”

在处理日期时,SQL Server可能会略微奇数。它主要在SQL Server 2008中使用新的日期和时间格式修复。 Tibor Karaszi 的权威性文章

编辑:另一个article by Tony Rogerson为非信徒

答案 1 :(得分:2)

不是像字符串一样动态构建SQL插入语句,如果使用存储过程或参数化查询,您将能够将C#datetime值作为日期时间对象传递,并且不会出现格式不匹配导致问题。

[更正 - 这仅适用于SQL 2008,有关2000/2005有效字符串,请参阅gbn's answer]
或者,我相信无论SQL服务器区域设置如何,如果您将日期时间作为完整的ISO 8601字符串传递,它将被处理正确。

E.g。

2010-03-10T14:17Z

<击>

就个人而言,我会推荐参数化查询或存储过程,因为它们也解决了很多其他问题。