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

我有一个为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类型,是我们自己的业务对象(非实体)中的属性。

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

确保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或不适当的值。

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

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

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

请尝试使用(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; 

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

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;

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

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

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

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