将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围

Posted

技术标签:

【中文标题】将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围【英文标题】:The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value 【发布时间】:2013-04-13 13:26:01 【问题描述】:

我有一种日期时间类型,当我想保存 DateTime.Now 时,我在数据库中一切正常。但是当我想保存我的值时,我得到了错误

                LogTime = log.AnswerTime ?? DateTime.Now

LogTime值为:4/3/2013 12:05:04 PM

我认为一切都很好,但为什么呢?

【问题讨论】:

【参考方案1】:

在 .NET DateTime2 和 DateTime 中都映射到 System.DateTime,因此没有任何转换。问题来自您的数据库如何处理这两种数据类型。例如,MSSQL 以不同的方式处理它们。在 MSSQL 中,DATETIME 支持 1753/1/1 到 9999/12/31,而 DATETIME2 支持 0001/1/1 到 9999/12/31。

这意味着,如果您从数据库的 DateTime2 列中读取 null 值,您将得到 0001/1/1,这绝对是一个超出范围的值。

.NET 为您提供了一些帮助,您可以在此处阅读它http://msdn.microsoft.com/en-us/library/bb675168.aspx。

确保您使用的是 SqlDb 类型,如果您使用的是数据网格,请确保您的列正确使用 typeof,例如

new DataColumn("myDate", typeof(DateTime))

【讨论】:

这不是错误的原因,因为 null log 日期将默认使用 'DateTime.Now' 在上面提供的代码中 . DateTime.Now 应该始终是 SmallDateTime 字段的有效值(除非您将 PC 时钟设置回 300 年),但是我目前在尝试简单地保存 04/ 的“DateTime.Now”值时遇到完全相同的错误10/2013 12:49:00 到 SQL SmallDateTime 字段中。令人沮丧的是,我在 SO 的任何地方都找不到正确的答案。

以上是关于将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

将 datetime2 数据类型转换为 datetime 数据错误

将 datetime2 数据类型转换为 datetime 数据类型会导致值超出范围

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围

哪一列导致“将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围”?

如何识别列抛出 System.Data.SqlClient.SqlException? (将 datetime2 数据类型转换为 datetime 数据类型)

如何将 sql datetime2 转换为加倍?