当前位置:  开发笔记 > 编程语言 > 正文

错误 - SqlDateTime溢出.必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间

如何解决《错误-SqlDateTime溢出.必须在1/1/175312:00:00AM和12/31/999911:59:59PM之间》经验,为你挑选了5个好方法。

我一直在使用我编写的这段代码,它以最不明确的方式工作.我希望在数据库中插入一行,其中包含两列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");

仍然是同样的错误,奇怪的是,上面的技巧适用于第一次插入数据库,但从那里失败了.有什么想法发生了什么?



1> Robert Pauls..:

DateTimeC#中的A 是值类型,而不是引用类型,因此不能为null.但它可以DateTime.MinValue是超出Sql Servers DATETIME数据类型范围的常量.

保证值类型始终具有(默认)值(零),而不需要始终需要显式设置(在本例中为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

datetime
日期和时间数据,从1753年1月1日到9999年12月31日,精确到三百分之一秒(相当于3.33毫秒或0.00333秒).值四舍五入为.000,.003或.007秒的增量

smalldatetime
从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年后)

考虑使用DateTime2与.net更好地对齐的sql 数据类型,其中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");

MSDN datetime2(Transact-SQL)


感谢关于`DateTime`的指针在C#中不可为空!

2> 小智..:

我发现在许多数据库相关错误之后,SQL最小/最大日期使用了以下工作:

DateTime rngMin = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;

DateTime rngMax = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;


这应该得到最多的选票,也是正确的答案.

3> Amy B..:

您对这两列的代码看起来没问题.在该映射类上查找任何其他日期时间列.此外,启用datacontext上的日志记录以查看查询和参数.

dc.Log = Console.Out;

DateTime初始化为c#的0 - 即0001-01-01.这是由linqtosql通过sql字符串文字传输到数据库:'0001-01-01'.Sql无法解析此日期的T-Sql日期时间.

有几种方法可以解决这个问题:

确保使用SQL可以处理的值初始化所有日期时间(例如Sql的0:1900-01-01)

确保可能偶尔遗漏的任何日期时间都是可以为空的日期时间



4> Phil Haselde..:

在将.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进行比较.价值.



5> Altaf Patel..:

如果您尝试将DateTime类型的变量设置为null,则会发生此错误.将变量声明为可空,即DateTime?.这将解决问题.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有