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

bil*_*ill 10 c# linq-to-entities sql-server-2005 sql-server-2008

我有一个为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,
Run Code Online (Sandbox Code Playgroud)

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

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

Ree*_*sey 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;
Run Code Online (Sandbox Code Playgroud)

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

话虽这么说,我个人更喜欢存储DateOfBirthDateTime?(可空类型)而不是使用"魔术值"(DateTime.MinValue)来保存数据库null或不适当的值.


Mik*_*ney 7

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

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

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


ROF*_*IME 5

尝试(DateTime)SqlDateTime.MinValue改用:

 DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
    (DateTime)SqlDateTime.MinValue : s.Date_Of_Birth.Value,
Run Code Online (Sandbox Code Playgroud)

您将需要包括:

using System.Data.SqlTypes;
Run Code Online (Sandbox Code Playgroud)

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


Stu*_*tLC 1

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