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

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

例如:在插入声明中,我传递的是“2010-03-10 00:00:00-05:00”,但机器区域日期设置不同。 我收到这个错误: –

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

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

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

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

处理日期时,SQL Server可能有点奇怪 。 它主要在SQL Server 2008中使用新的日期和时间格式修复。 Tibor Karaszi 最终文章

编辑: 托尼罗杰森的另一篇文章为不信的人

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

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

例如

2010-03-10T14:17Z 

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