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

时间:2010-08-03 17:30:52

标签: c# sql-server-2005 sql-server-2008 linq-to-entities

我有一个为2008年写的应用程序。

我们正在使用linq实体。

我们现在必须将数据库切换到2005.我在linq SELECT查询中收到以下错误:

  

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

违规行是:

DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
    DateTime.MinValue : s.Date_Of_Birth.Value,

DateOfBirth的类型为DateTime,属于我们自己的业务对象(非实体)中的属性。

任何人都知道如何修改此行以使此查询运行?

8 个答案:

答案 0 :(得分:14)

确保lowdate至少为1/1/1753。

如果您尝试提供之前的日期,EF会将其转换,并将其传递给您的查询。此外,您不需要在查询中使用DateTime.MinValue,而是您的min:

DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
    new DateTime(1753,1,1) : s.Date_Of_Birth.Value;

请记住,使用EF,查询会在服务器上编译并转换为SQL,因此这些值也必须适合。

话虽这么说,我个人更喜欢将DateOfBirth存储为DateTime?(可空类型),而不是使用“魔术值”(DateTime.MinValue)来保存数据库null或不合适值。

答案 1 :(得分:7)

另外,为了在这里添加好的答案,请尝试使用SqlDateTime.MinValue而不是1/1/1973或DateTime.MinValue。

http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldatetime.minvalue.aspx

当然,它与1973年1月1日的情况相同,但它更清洁,更不那么神奇。

答案 2 :(得分:4)

请尝试使用(DateTime)SqlDateTime.MinValue

 DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
    (DateTime)SqlDateTime.MinValue : s.Date_Of_Birth.Value,

您需要包含:

using System.Data.SqlTypes;

如果您仍想使用非空日期字段,那将解决此问题。但是,正如其他人提到的那样,最好使用空日期字段。

答案 3 :(得分:3)

DateTime.MinValue相当于00:00:00.0000000, January 1, 0001

SQL 2005中的DateTime是在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 P

之间

您应该创建一个

,而不是使用DateTime.MinValue
public static DateTime DateTimeMinValueInSQL2005 = new DateTime(1753,1,1);

并使用它代替DateTime.MinValue;

答案 4 :(得分:1)

当您尝试将DateTime.MinValue持久化到SQL DateTime字段时,通常会发生这种情况

答案 5 :(得分:1)

当然,将DateTime.MinValue替换为“1/1/1753 12:00:00 AM”

答案 6 :(得分:1)

我为此创建了一个扩展函数:

/// <summary>
/// Will return null if the CLR datetime will not fit in an SQL datetime
/// </summary>
/// <param name="datetime"></param>
/// <returns></returns>
    public static DateTime? EnsureSQLSafe(this DateTime? datetime)
    {
        if (datetime.HasValue && (datetime.Value < (DateTime)SqlDateTime.MinValue || datetime.Value > (DateTime)SqlDateTime.MaxValue))
            return null;

        return datetime;
    }

答案 7 :(得分:0)

我通过添加以下代码解决了这个问题。

DateTime FromDate = dtpFromDate.Value;

DateTime ToDate =dtpToDate.Value;