【问题标题】:Why when I insert a DateTime null I have "0001-01-01" in SQL Server?为什么当我在 SQL Server 中插入 DateTime null 时,我有“0001-01-01”?
【发布时间】:2013-05-17 13:21:48
【问题描述】:

我尝试在我的数据库中为键入“日期”的字段插入值 null (DateTime),但我总是得到一个 '0001-01-01'。我不明白,这个字段“允许空值”,我不知道为什么我有这个默认值。

我正在使用 C# asp .net 和 MVC(实体框架),这是我的代码:

Budget_Synthesis newBS = new Budget_Synthesis
{
    Budget_Code = newBudgetCode,
    Last_Modified_Date = null
};
db.Budget_Synthesis.AddObject(newBS);

Last_Modified_Date 的类型是 System.DateTime?所以我不知道他们为什么改变这个'null'。

如果我尝试在我的应用程序上显示该值,我会得到 01/01/0001 00:00:00

0001-01-01 使用 SSMS

谁能解释一下为什么我不能得到一个真正的“NULL”?

最好的问候

【问题讨论】:

  • 请出示您的代码
  • 您正在将 null datetime 的 c# 值插入到 sqldatetime 字段中?
  • 你是如何插入的?这很重要。很多。
  • sql server 甚至不能存储 0001-01-01; sql server 中的最小值是 1753 年 1 月 1 日。你在哪里看到这个 0001-01-01,究竟
  • 最新编辑:您展示了一些代码,将对象添加到看起来是某种 ORM 的对象中。正确的;我们到了某个地方......这是什么ORM?那是什么 AddObject ?这一切是如何配置的?你没有告诉我们的是所有这些是如何进入数据库的......

标签: c# sql sql-server null default


【解决方案1】:

我认为这是null对应的值

【讨论】:

  • @Andomar 这一切都很好,但这不是这个答案所说的
  • @MarcGravell:评论的意思是附加信息。如果你运行var d = new DateTime(); Console.WriteLine(d);,它会打印0001-01-01,这让我不同意反对意见。
  • @Andomar 是的,我很清楚日期时间的零行为;但如果没有来自 OP 的 很多 更多上下文,这只是一个随机事实。实际上,现在编辑到问题中的代码显示使用了null,这表明该类型很可能是DateTime?DateTime? 的默认值为 not 0001-01-01
  • @MarcGravell:是的,我认为 nHibernate、Linq2Sql 或 EF 在某处将null 转换为DateTime,最终结果为0001-01-01。也许该列在 EF 中被标记为不可为空。在某种程度上null 对应于0001-01-01,这就是这个答案所说的。可能不是一个很好的答案,但它来自一个新用户,我觉得这根本不值得反对。
【解决方案2】:

如果Last_Modified_DateDateTime 类型,则不能有“真正的空”,因为DateTime structure - 正如其他人已经说过的那样 - 不能为空。所以你的示例代码甚至不会编译。

如果Last_Modified_Date 的类型为DateTime? (Nullable<DateTime>),则您的代码是正确的,但是-正如@Nikola Dimitroff 在他的回答中所说-您的数据库中不能有“真正的空”,因为默认值DateTime? 是 01/01/0001 00:00:00。

您正在寻找的“真正的空”是DBNull.Value,但您只能将它用于System.DBNull 类型;如果你分配 Last_Modified_Date = DBNull.Value ,无论 Last_Modified_Date 的类型是什么,你的代码都不会编译。

【讨论】:

    【解决方案3】:

    当您说您要设置一个空的DateTime 时,您是使用Nullable<DateTime>(又名DateTime?)还是简单地使用DateTime?后者是一个值类型,它的默认值正好是01/01/0001 00:00:00

    【讨论】:

    • 根据将null分配给大概日期的代码示例,我们知道它不可能是DateTime;因此DateTime? 最有可能
    • @NikolaDimitroff 这是一个System.DateTime?,当我将我的模型与数据库链接时,EntityFramework 生成,这就是为什么我可以给他一个“空”但我不知道他为什么在这个默认值中更改它价值。
    【解决方案4】:

    对于 ADO.NET(至少从 .NET 4.7 开始),传递 null(例如使用 ExecuteNonQuery)被转换为 SQL DEFAULT 关键字。

    这可以使用 SQL Server Profiler 进行验证。

    例如下面的代码:

    var sqlCommand = new SqlCommand();
    sqlCommand.CommandText = "EXEC CreateLog @UserName, @CreatedOn";
    sqlCommand.Parameters.AddWithValue("@UserName", "George");
    sqlCommand.Parameters.AddWithValue("@CreatedOn", (DateTime?)null);
    sqlCommand.ExecuteNonQuery();
    

    翻译成:

    exec sp_executesql N'EXEC CreateLog @UserName, @CreatedOn',
        N'@UserName nvarchar(6), @CreatedOn nvarchar(4000)',
        @UserName=N'George',@CreatedOn=default
    

    这通常只会导致以下错误:

    参数化查询 [...] 需要未提供的参数“@CreatedOn”。

    更多详情请见this answer

    【讨论】:

      【解决方案5】:

      在python编程语言中。代码的返回类型:

      print(type(df['col_name'].get(key='0001-01-01 BC')))
      <class 'NoneType'>
      

      它不为空,更具体地说它是 NoneType

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-31
        • 2013-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        相关资源
        最近更新 更多