如何防止超出范围的日期时间值错误?
Posted
技术标签:
【中文标题】如何防止超出范围的日期时间值错误?【英文标题】:How to prevent out-of-range datetime value error? 【发布时间】:2011-01-26 02:48:41 【问题描述】:我正在将一个临时插入语句从 c# 应用程序传递到 sql server 2000/2005。有时,如果机器(安装 sql server 的地方)日期时间格式与我传入的不同,则会引发错误。
例如:在插入语句中,我传递了“2010-03-10 00:00:00-05:00”,但机器区域日期设置不同。我收到此错误:-
将 char 数据类型转换为 日期时间数据类型导致 超出范围的日期时间值。
我能否在 c# 的 Insert 语句中传递一些通用的日期格式,该格式与任何机器的区域日期时间设置完美配合?
【问题讨论】:
【参考方案1】:“yyyymmdd”是最安全的,基本的 ISO-8601 格式。 “yyyy-mm-dd”有以下链接提到的问题
与时间:“yyyymmdd hh:mm:ss”
SQL Server 在处理日期时间时可能会有点奇怪。它主要在 SQL Server 2008 中使用新的日期和时间格式进行了修复。 Tibor Karaszi
的权威文章编辑:还有一个 article by Tony Rogerson 给不信的人
【讨论】:
日期/时间,刚刚爱上它们,现在加入 JSON 和 ajax 以获得更多乐趣 :) +1 链接【参考方案2】:如果您使用存储过程或参数化查询,您将能够将 C# 日期时间值作为日期时间对象传递,而不是将 SQL 插入语句动态构建为字符串,并且不会出现导致问题的格式不匹配。
[更正 - 这仅适用于 SQL 2008,请参阅 gbn's answer 获取 2000/2005 有效字符串]另外,我相信无论 SQL 服务器的区域设置如何,如果您传递您的日期时间作为一个完整的ISO 8601 字符串,它将被正确处理。
例如
2010-03-10T14:17Z
就个人而言,我会推荐参数化查询或存储过程,因为它们也解决了许多其他问题。
【讨论】:
@gbn。哪个位,参数/存储过程或 ISO 8601 字符串? 您的 ISO 8601 字符串。请参阅我的回答,了解为什么 yyyy-mm-dd 依赖于 SQL 语言设置。使用存储的 procs/params 更好,因为 .net 将处理翻译,而 SQL Server 将获得本机日期时间值 @gbn。真的!?疯狂的。我得去看看。 @gbn,是的,谢谢。我有。不过尝试这些东西总是好的。我们工作中的大多数数据库都是 2000/2005 年,所以我很惊讶我以前没有打过那个。我已经从我的答案中删除了相关部分。 这不是很明显,但是如果你使用 procs 或参数化,那么 SQL 将看不到字符串并进行转换,因为它已经是 datetime以上是关于如何防止超出范围的日期时间值错误?的主要内容,如果未能解决你的问题,请参考以下文章
如果超出范围,防止 jQuery UI datepicker 更改文本字段的值
从 Access 导出到 Excel 时出现日期超出范围错误