Ошибка - переполнение SqlDateTime. Должно быть между 01.01.1753 12:00:00 и 31.129999 11:59:59 - PullRequest
10 голосов
/ 03 августа 2010

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

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

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

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

Неправильная строка:

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

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

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

Ответы [ 7 ]

14 голосов
/ 03 августа 2010

Убедитесь, что lowdate не меньше 1/1 / 1753.

Если вы попытаетесь указать дату до этого, EF преобразует ее и передаст в ваш запрос. Кроме того, вам не нужно использовать DateTime.MinValue в запросе, а то, что будет вашим минимумом:

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) для хранения нулевых или недопустимых значений в базе данных.

7 голосов
/ 03 августа 2010

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

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

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

4 голосов
/ 24 мая 2012

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

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

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

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

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

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

1 голос
/ 31 января 2017

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

/// <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;
    }
1 голос
/ 03 августа 2010

Конечно, замените DateTime.MinValue на «1/1/1753 12:00:00 AM»

1 голос
/ 03 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...