Why when I insert a DateTime null I have "0001-01-01" in SQL Server?

49,156

Solution 1

I think this is the value corresponding to the null

Solution 2

If Last_Modified_Date is of type DateTime, you can't have "real null" because DateTime structure - as others already said- is not nullable. So your sample code will not even compile.

If Last_Modified_Date is of type DateTime? (Nullable<DateTime>) your code is correct, but -as @Nikola Dimitroff said in his answer- you can't have "real null" in your database because the default value for DateTime? is 01/01/0001 00:00:00.

The "real null" you are looking for is DBNull.Value, but you can use it only for System.DBNull type; if you assign Last_Modified_Date = DBNull.Value , whatever the type of Last_Modified_Date is, your code will not compile.

Solution 3

When saying you are trying to put a null DateTime, are you using a Nullable<DateTime> (a.k.a DateTime?) or simply DateTime? The latter is a value type and its default value is precisely 01/01/0001 00:00:00

Share:
49,156
Alex
Author by

Alex

Updated on August 18, 2022

Comments

  • Alex
    Alex over 1 year

    I try to insert the value null (DateTime) in my database for a field typed 'date' but I always get a '0001-01-01'. I don't understand, this field "allow nulls" and I don't know why I have this default value.

    I'm using C# asp .net with MVC (Entity Framework), this is my code :

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

    Last_Modified_Date is typed System.DateTime? so I don't know why they change this 'null'.

    If I try to display the value on my application I get 01/01/0001 00:00:00

    And 0001-01-01 with SSMS

    Someone can explain me why I can't get a real 'NULL' ?

    Best regards

  • Marc Gravell
    Marc Gravell almost 11 years
    @Andomar which is all well and good, but that isn't what this answer says
  • Andomar
    Andomar almost 11 years
    @MarcGravell: Comment was meant as additional information. If you run var d = new DateTime(); Console.WriteLine(d);, it prints 0001-01-01, which makes me disagree with the downvotes.
  • Marc Gravell
    Marc Gravell almost 11 years
    Based on the code sample that assigns null to what is presumably a date, we know that it cannot be DateTime; thus DateTime? is the most likely
  • Marc Gravell
    Marc Gravell almost 11 years
    @Andomar yes, I'm well aware of the zero behaviour of datetime; but without a lot more context from the OP, this is just a random factoid. Indeed, the code now edited into the question shows use of null, which indicates that the type is most likely DateTime?. The default of DateTime? is not 0001-01-01
  • Andomar
    Andomar almost 11 years
    @MarcGravell: Yeah, I presume nHibernate, Linq2Sql or EF converts the null to a DateTime somewhere, and that ends up as 0001-01-01. Perhaps the column is marked as non-nullable in EF. In a way null corresponds to 0001-01-01, which is what this answer says. Might not be a stellar answer, but it's from a new user, and I don't feel this deserves downvotes at all.
  • Alex
    Alex almost 11 years
    @NikolaDimitroff It's a System.DateTime? generated by EntityFramework when I linked my Models with the DB, that's why I can give him a 'null' but I don't knwo why he changes it in this default value.