DateTime.MinValue和SqlDateTime溢出

时间:2013-03-01 12:04:15

标签: c# sql-server datetime

我不想验证txtBirthDate所以我想在数据库中传递DateTime.MinValue

我的代码:

 if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = DateTime.MinValue;
 else
     objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);

DateTime.MinValue返回Date = {1/1/0001 12:00:00 AM}

我遇到了SQL错误:

  

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

我支持它,但我不明白为什么DateTime.MinValue返回无法在数据库中插入的无效日期时间。如何处理这种情况?

10 个答案:

答案 0 :(得分:79)

基本上,请勿使用DateTime.MinValue来表示缺失值。您无法在SQL Server DateTime字段中使用DateTime.MinValue,因为SQL Server的最小值为1753的开头。

相反,将BirthDate属性设为Nullable<DateTime>(又名DateTime?),并在没有值时将其设置为null。还要确保您的数据库字段可以为空。然后,您只需确保null最终作为数据库中的NULL值。具体如何做到这一点取决于您的数据访问权限,而您尚未告诉我们任何相关信息。

答案 1 :(得分:71)

非常简单,请避免使用DateTime.MinValue代替System.Data.SqlTypes.SqlDateTime.MinValue

答案 2 :(得分:9)

虽然这是一个老问题,但另一个解决方案是将datetime2用于数据库列。 MSDN Link

答案 3 :(得分:3)

  

这是你能做的。虽然有很多方法可以实现它。

DateTime? d = null;    
if (txtBirthDate.Text == string.Empty)
    objinfo.BirthDate = d;
else
    objinfo.BirthDate =  DateTime.Parse(txtBirthDate.Text);
  

注意:仅当您的数据库日期时间列为Allow Null时,此选项才有效。否则,您可以为DateTime d。

定义标准最小值

答案 4 :(得分:3)

我正在使用此函数来tryparse

public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
    {
        bool valid = false;
        tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
        System.Data.SqlTypes.SqlDateTime sdt;
        if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
        {
            try
            {
                sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
                valid = true;
            }
            catch (System.Data.SqlTypes.SqlTypeException ex)
            {

            }
        }

        return valid;
    }

答案 5 :(得分:2)

来自MSDN:

  

日期和时间数据,从1753年1月1日到9999年12月31日,带有   准确度为三百分之一秒,或3.33毫秒。值   四舍五入到.000,.003或.007毫秒的增量。存储   作为两个4字节整数。前4个字节存储天数   在基准日期之前或之后,即1900年1月1日。基准日期是   系统的参考日期。日期时间早于1月1日的值,   1753年,不允许。其他4个字节存储一天中的时间   表示为午夜后的毫秒数。秒钟有   有效范围为0-59。

对于DateTime值,SQL使用与C#不同的系统。

您可以将MinValue用作标记值 - 如果它是MinValue - 将null传递给您的对象(并将日期存储为可以在数据库中为空)。

if(date == dateTime.Minvalue)
    objinfo.BirthDate = null;

答案 6 :(得分:2)

简单地说,使用DateTime.MinVaue作为默认值。

根据您所处的环境,有几个不同的MinValues

我曾经有一个项目,在那里我实现了一个Windows CE项目,我使用的是框架的DateTime.MinValue(年份0001),数据库MinValue(1753)和一个UI控件{{1 (我认为是1970年)。所以至少有 3个不同的MinValues 会导致奇怪的行为和意外的结果。 (而且我相信甚至有第四个(!)版本,我只是不记得它来自哪里。)。

使用可空的数据库字段,然后将您的值更改为DateTimePicker。如果代码中无效值,则也应该是数据库中的值。 : - )

答案 7 :(得分:1)

如果使用DATETIME2,您可能会发现必须像DATETIME2那样专门传递参数,否则它可能会有用地将其转换为DATETIME并出现相同的问题。

command.Parameters.Add("@FirstRegistration",SqlDbType.DateTime2).Value = installation.FirstRegistration;

答案 8 :(得分:0)

嗯......获得SQL最短日期非常简单

DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue.Value;

答案 9 :(得分:-6)

使用扩展程序

public static class DateTimeExtensions
{
    public static DateTime MinValue(this DateTime sqlDateTime)
    {
        return new DateTime(1900, 01, 01, 00, 00, 00);
    }
}


DateTime date = DateTime.Now;
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString());