Итак, вы прокручиваете вниз, потому что ответы не работают:
Это работает как по волшебству (но они говорят, что у этого есть проблемы с эффективностью для больших данных, и вам все равно, как и мне)
1- Тип данных в базе данных в моем случае - «datetime» и «допускающий значение NULL».
Пример формата данных в БД:
2018-11-06 15:33:43.640
В C # при преобразовании в строку выглядит так:
2019-01-03 4:45:16 PM
Итак, формат такой:
yyyy/MM/dd hh:mm:ss tt
2- Итак, вам нужно сначала подготовить переменные даты и времени в правильном формате:
Пример 1
yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")
Пример 2 - Диапазон дат за последние 30 дней
DateTime dateStart = DateTime.Now.AddDays(-30);
DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);
3- Наконец, запрос linq, который вы потеряли в течение дня, пытаясь найти (требуется EF 6)
using System.Data.Entity;
_dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();
Чтобы также принять во внимание сравнение времени:
(DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) >= dateStart && DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) <= dateEnd)
Обратите внимание, что следующий метод, упомянутый в других вопросах и ответах stackoverflow, не будет работать правильно:
....
&&
(
s.Created_at.Value.Day >= dateStart.Day && s.Created_at.Value.Day <= dateEnd.Day &&
s.Created_at.Value.Month >= dateStart.Month && s.Created_at.Value.Month <= dateEnd.Month &&
s.Created_at.Value.Year >= dateStart.Year && s.Created_at.Value.Year <= dateEnd.Year
)).count();
если день начала приходился, например, на этот месяц, а день окончания - на следующий месяц, запрос вернет false и никаких результатов, например:
DatabaseCreatedAtItemThatWeWant = 2018/12/05
startDate = 2018/12/01
EndDate = 01.01.2019
запрос всегда будет искать дни между 01 и 04 без учета "месяца", поэтому "s.Created_at.Value.Day <= dateEnd.Day" завершится ошибкой
И если у вас действительно большие данные, вы должны выполнить собственный SQL-запрос, а не linq
...
... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
....
благодаря