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

C# 如何防止超出范围的日期时间值错误?,c#,sql-server,sql-server-2005,tsql,datetime,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语句中传递一些通用日期格式吗?它可以与任何机器区域日期时间设置完美配合。“

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

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

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

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

“yyyymmdd”是最安全的基本ISO-8601格式。“yyyy-mm-dd”有如下链接所述的问题

带时间:“yyyymmdd hh:mm:ss”

SQL Server在处理日期时间时可能有点奇怪。它在SQLServer2008中基本上是固定的,使用了新的日期和时间格式作者的权威文章


编辑:另一个用于不相信的人,而不是将SQL insert语句动态构建为字符串,如果使用存储过程或参数化查询,您将能够将C#datetime值作为datetime对象传递,并且不会因格式不匹配而导致问题

[更正-这仅适用于SQL 2008,有关2000/2005有效字符串的信息,请参阅]
或者,我相信,不管SQL Server的区域设置如何,如果您将日期时间作为完整字符串传递,则它将被正确处理

例如


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

@gbn。哪个位、参数/存储过程或ISO 8601字符串?您的ISO 8601字符串。请参阅我的答案,了解为什么yyyy-mm-dd依赖于SQL语言设置。使用存储的procs/params更好,因为.net将处理转换,SQL Server将获得本机日期时间value@gbn. 真正地疯子我得查一下。@gbn,是的,谢谢。我有。不过,尝试这些东西总是很好的。我们工作的大多数数据库都是2000/2005年的,所以我很惊讶我以前没有碰到过。我已经从我的答案中删除了相关的部分。这并不明显,但是如果你使用procs或parametrisation,那么SQL将不会看到字符串并进行转换,因为它已经是datetimedate/次了,只是喜欢它们,现在加入JSON和ajax来获得更多乐趣:)+1用于链接
2010-03-10T14:17Z