Sie scrollen also nach unten, weil die Antworten nicht funktionieren:
Das funktioniert wie Magie (aber sie sagen, es hat Effizienzprobleme für Big Data, und es ist dir egal wie mir)
1- Der Datentyp in der Datenbank ist in meinem Fall "datetime" und "nullable".
Das Beispieldatenformat in der Datenbank lautet wie folgt:
2018-11-06 15:33:43.640
Ein in C # konvertiertes Zeichen lautet wie folgt:
2019-01-03 4:45:16 PM
Das Format ist also:
yyyy/MM/dd hh:mm:ss tt
2- Sie müssen also zuerst Ihre datetime-Variablen im richtigen Format vorbereiten:
Beispiel 1
yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")
Beispiel 2 - Datenzeitbereich für die letzten 30 Tage
DateTime dateStart = DateTime.Now.AddDays(-30);
DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);
3- Schließlich die Linq-Abfrage, die Sie am Tag des Suchens verloren haben (EF 6 erforderlich).
using System.Data.Entity;
_dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();
Um auch den Zeitvergleich zu berücksichtigen:
(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)
Beachten Sie, dass die folgende Methode, die in anderen Fragen und Antworten zum Stapelüberlauf erwähnt wird, nicht ordnungsgemäß funktioniert:
....
&&
(
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();
Wenn der Starttag beispielsweise in diesem Monat war und der Endtag im nächsten Monat liegt, gibt die Abfrage false und keine Ergebnisse zurück, zum Beispiel:
DatabaseCreatedAtItemThatWeWant = 2018/12/05
startDate = 2018/12/01
EndDate = 04.01.2019
Die Abfrage sucht immer nach Tagen zwischen 01 und 04, ohne den "Monat" zu berücksichtigen. Daher schlägt "s.Created_at.Value.Day <= dateEnd.Day" fehl
Und falls Sie wirklich große Datenmengen haben, würden Sie Native SQL Query anstelle von Linq ausführen
...
... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
....
Vielen Dank