我正在将一个特殊的Insert语句从c#应用程序传递给sql server 2000/2005。有时候,如果机器(安装了sql server)的日期时间格式与我传入的格式不同,则会抛出错误。
e.g。 :在Insert语句中,我传递的是“2010-03-10 00:00:00-05:00”,但机器区域日期设置不同。我收到了这个错误: -
将char数据类型转换为 日期时间数据类型导致 超出范围的日期时间值。
我可以在c#的Insert语句中传递一些通用日期格式,它与任何机器的区域日期时间设置完美配合。?
答案 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
击> <击> 撞击>
就个人而言,我会推荐参数化查询或存储过程,因为它们也解决了很多其他问题。