Ошибка - переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.12.9999 23:59:59

У меня есть приложение, написанное для 2008 года.

Мы используем linq для сущностей.

Теперь нам пришлось переключить БД на 2005. Я получаю следующую ошибку при запросах linq SELECT:

Ошибка - переполнение SqlDateTime. Должно быть между 01.01.1753 00:00:00 и 31.12.1999 23:59:59.

Оскорбительная строка:

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

DateOfBirth имеет тип DateTime и является свойством в нашем собственном бизнес-объекте (не сущности).

Кто-нибудь знает, как я могу изменить эту строку, чтобы запустить этот запрос?


person bill    schedule 03.08.2010    source источник
comment
вы установили на нем профилировщик sql, чтобы увидеть, что на самом деле работает SQL?   -  person BlackICE    schedule 03.08.2010


Ответы (8)


Убедитесь, что 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? (тип, допускающий значение NULL) вместо использования «магического значения» (DateTime.MinValue) для хранения нулевых или несоответствующих значений в базе данных.

person Reed Copsey    schedule 03.08.2010

Кроме того, просто чтобы добавить сюда хорошие ответы, попробуйте использовать SqlDateTime.MinValue вместо 1/1/1973 или DateTime.MinValue.

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

Конечно, это то же самое, что и 01.01.1973, но намного чище и менее волшебно.

person Mike Mooney    schedule 03.08.2010

Попробуйте вместо этого использовать (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;

Это решит проблему, если вы все еще хотите использовать ненулевое поле даты. Однако, как отмечали другие, может быть лучше использовать пустое поле даты.

person Gaff    schedule 24.05.2012

DateTime.MinValue эквивалентно 00:00:00.0000000, January 1, 0001.

И DateTime в SQL 2005 находится между 01.01.1753 12:00:00 AM и 31.12.9999 11:59:59 P

Вместо использования DateTime.MinValue вы должны создать

public static DateTime DateTimeMinValueInSQL2005 = new DateTime(1753,1,1);

и используйте его вместо DateTime.MinValue;

person Damian Leszczyński - Vash    schedule 03.08.2010

Я создал для этого функцию расширения:

/// <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;
    }
person tjeuten    schedule 31.01.2017

Это часто случается, когда вы пытаетесь сохранить DateTime.MinValue в поле SQL DateTime.

person StuartLC    schedule 03.08.2010
comment
Я тоже так думала, но он приносит, а не экономит. - person Kirk Woll; 03.08.2010
comment
@ Кирк Волл: это время выборки (потому что даты после 1753 года), но может хранить такое маленькое значение, как в DataTime.MinValue; - person Damian Leszczyński - Vash; 03.08.2010

Конечно, замените DateTime.MinValue на "01.01.1753 12:00:00 AM"

person George Johnston    schedule 03.08.2010

Я решил это, добавив следующий код.

DateTime FromDate = dtpFromDate.Value;

DateTime ToDate =dtpToDate.Value;

person Rashmi Prabha    schedule 22.10.2020