我一直在使用我写的这段代码,它以一种最不明确的方式工作。我希望在包含两列DateTime的数据库中插入一行:
myrow.ApprovalDate = DateTime.Now
myrow.ProposedDate = DateTime.Now
然而,当我更新数据库时,我收到了这个错误:
SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。
我甚至尝试过从数据库中复制一个插入值,并将其硬编码到正在更新的对象中:
// I copied this value from the DB
myrow.ApprovalDate = Convert.ToDateTime("2008-12-24 00:00:00.000");
同样的错误,奇怪的是,上面的技巧在第一次插入数据库时有效,但从那时起就失败了。知道是怎么回事吗?
发布于 2009-01-22 05:03:46
ADateTime
in C#是值类型,而不是引用类型,因此不能为null。但是,它可以是常量DateTime.MinValue
,它不在Sql服务器的范围内。DATETIME
数据类型。
值类型保证总是有一个(默认)值(0),而不需要总是显式设置(在本例中是DateTime.MinValue)。
结论是您可能有一个试图传递给数据库的未设置的DateTime值。
DateTime.MinValue = 1/1/0001 12:00:00 AM
DateTime.MaxValue = 23:59:59.9999999, December 31, 9999,
exactly one 100-nanosecond tick
before 00:00:00, January 1, 10000
MSDN:DateTime.MinValue
关于Sql Server
日期时间
从1753年1月1日到9999年12月31日的日期和时间数据,精确到百分之一秒(相当于3.33毫秒或0.00333秒)。将值四舍五入为.000、.003或.007秒的增量
小日期时间
从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟。小于或等于29.998秒的SmalldateTime值向下舍入到最接近的分钟;大于或等于29.999秒的值向上舍入到最接近的分钟。
MSDN:Sql Server DateTime和SmallDateTime
最后,如果您发现自己正在传递一个C#DateTime
作为sql的字符串,您需要将其格式化为以下格式,以保持最大的精度并防止sql server引发类似的错误。
string sqlTimeAsString = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");
更新(8年后)
考虑使用sqlDateTime2
更符合.net的数据类型DateTime
包含日期范围0001-01-01 through 9999-12-31
和时间范围00:00:00 through 23:59:59.9999999
string dateTime2String = myDateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffffff");
发布于 2010-12-17 07:53:19
我发现在发生了许多与数据库相关的错误后,使用下面的方法可以很好地处理SQL最小/最大日期:
DateTime rngMin = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
DateTime rngMax = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;
发布于 2011-08-09 11:22:35
在将.Net DateTime与SqlDateTime.MinValue或MaxValue进行比较时要小心。例如,以下代码将抛出异常:
DateTime dte = new DateTime(1000, 1, 1);
if (dte >= SqlDateTime.MinValue)
//do something
原因是MinValue返回的是SqlDateTime,而不是DateTime。因此,.Net尝试将dte转换为SqlDateTime进行比较,因为它超出了可接受的SqlDateTime范围,所以会抛出异常。
一种解决方案是将您的DateTime与SqlDateTime.MinValue进行比较。价值..。
https://stackoverflow.com/questions/468045
复制相似问题