【问题标题】:SqlDateTime overflow, but I want a NULL or MinValueSqlDateTime 溢出,但我想要一个 NULL 或 MinValue
【发布时间】:2011-01-12 20:09:14
【问题描述】:

在这个项目中,我正在跟踪创建、编辑和最终处理某些内容的时间。我为此设置了三个 DateTime 字段。下面的代码是我创建记录时的代码。

newsArchive.CreateDateTime = DateTime.Now;
newsArchive.ModifyDateTime = DateTime.MinValue;
newsArchive.SendDateTime = DateTime.MinValue;
naRepository.Add(newsArchive);
naRepository.Save();

我收到“SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。”当我尝试添加它时。我知道我不能发送 NULL。您将如何处理?

我正在使用 Linq2SQL 来处理这个。

【问题讨论】:

  • 当你说你知道你不能发送空值 - 你的意思是你不能使用 newsArchive.SendDateTime = SqlDateTime.Null;或者你的意思是你不能使用 newsArchive.SendDateTime = null; ?您的主题表明 NULL 是可以接受的。

标签: c# datetime sqldatetime


【解决方案1】:

为什么不能发送空值? AFAIK,Linq2SQL 支持可为空的值类型;您只需要 DB 中的列可以为空,否则 L2S 不会将 DAO 投影为可以为空的类型。

您可以使用 (DateTime)(SqlDateTime.MinValue) 代替 DateTime.MinValue。这将使用与 SQL 兼容的最小日期时间值,显式转换为 DateTime。

虽然 SqlDateTime 和 DateTime 实际上都将时间存储为 UInt64“滴答”值,但两种类型之间的区别在于 SQL Server 使用不同的纪元(值为零)和不同的分辨率(1“滴答”在几分之一秒)比 CLR 的日期时间。

【讨论】:

  • 奇怪的是,我认为之前出错了。现在可以了。我可以使用= null 并让它正常工作。服务器上的 DateTime 允许空值。
【解决方案2】:

您使用的是哪个版本的 SQL Server?如果您使用的是 SQL 2008(或 2008 R2),则可以使用 datetime2 数据类型,它可以支持所有 .NET DateTime 类型。

否则,请使用 NULL(您的模型需要具有 Nullable<DateTime> 类型的属性)或在数据类型的限制范围内,并且 DateTime.MinValue 超出 SQL 日期时间类型的限制。

【讨论】:

    【解决方案3】:

    创建您自己的最小日期 - 值为 1/1/1753 12:00:00 AM 的 Date 变量,并使用它代替 DateTime.MinValue

    【讨论】:

      【解决方案4】:

      datetime2 数据类型允许最早的日期为 1 年。您也可以使用 DateTime?在您的 .net 代码中允许空日期

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        相关资源
        最近更新 更多