Hallo zusammen,
ich hoffe, dass das hier her passt.
Ich lese aus einer Datei (60MB) Daten in eine Datatable ein.
Das Datumsformat ist nach Unix Timestamp gespeichert.
Dieses wandle ich erfolgreich ins DateTime Format um und erstelle damit eine geklonte Datatable mit dieser Spalte.
Das Format sieht nun so aus z.B: 02.01.2017 05:53
Die Tabelle geht über den ganzen Monat Januar, jeden Tag mit den unterschiedlichsten Uhrzeiten.
Ich möchte nun die Datensätze eingrenzen und zwar alles was nach 17 Uhr und vor 6 Uhr ist und das für den ganzen Monat.
Also setze ich einen Select auf die DataTable ab, nur welchen?
Das Problem ist hier, dass immer das Datum mit in der Spalte ist.
Die ultimative Lösung wäre: Eine Spalte nur mit Uhrzeit machen.
Aber gibt es auch andere Lösungen?
Wie kann der Select aussehen:
Beispiel:
DataRow[] drow = dtClone.Select("dateTimeMEZ >= '01.02.2017:00' and dateTimeMEZ <= '31.02.201706:00' ");
Da bringt er natürlich alle Uhrzeiten im Monat, auch tagsüber.
Mit der Uhrzeit funktioniert es am selben Tag mit ≥17 and ≤06:00.
Kann man das weiter eingrenzen?
Hallo,
mit ≥17 and ≤06:00
dürfte es gar nicht geben. Meinst Du "or" statt "and"?
Zur Frage: Mach doch die Abfrage über Linq statt über SQL und benutze dann in der betreffenden Spalte DateTime.TimeOfDay
zum abfragen.
Also in der Art (ungetestet):
dtClone.Rows.Where(dr =>
{
TimeSpan time = ((DateTime)dr["dateTimeMEZ"]).TimeOfDay;
return (time >= new TimeSpan(17, 0, 0)) || (time <= new TimeSpan(6, 0, 0));
})
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
@MarsStein
Jetzt noch den Monat in die LINQ Abfrage und dann ist es wie gewünscht 👍
Hallo MarsStein,
vielen Dank.
Es war natürlich 'or' gemeint.
Das dtClone ist eine Datatable, Rows dann die DataRowCollection, es kommt daher die Meldung:
'System.Data.DataRowCollection' enthält keine Definition für 'Where', und es konnte keine Erweiterungsmethode 'Where' gefunden werden, die ein erstes Argument vom Typ 'System.Data.DataRowCollection' akzeptiert (Fehlt eine Using-Direktive oder ein Assemblyverweis?).
Hallo,
DataRowCollection
erbt von InternalDataCollectionBase
und diese implementiert auch IEnumerable, aber nicht IEnumerable<T>
. Deshalb klappt es nicht mit der Where
-Extension.
Versuch es mal mit
dtClone.Rows.OfType<DataRow>().Where(...)
Wenn Du schon typisierte Rows hast, kannst Du natürlich auch den richtigen Typ nehmen bei OfType.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hey,
habe es nun mit einer "normalen" LINQ Abfrage gelöst, also
IEnumerable<DataRow> query = from b in dtClone.AsEnumerable() where b.Field<TimeSpan>("dateTimeMEZ") >= new TimeSpan(17, 0, 0) || b.Field<TimeSpan>("dateTimeMEZ") <= new TimeSpan(6, 0, 0) select b;
OfType kannte ich noch nicht, werde das mir mal anschauen.
Vielen Dank!
P.S. Die Abfrage auf den Monat brauche ich nicht, da es sich immer nur um einen bestimmten Monat handelt.
Hallo,
dtClone.AsEnumerable()
- das ist fein, die DataTableExtensions.AsEnumerable-Methode kannte ich wiederum nicht 👍
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Mal noch ne Frage zur Abfrage der Uhrzeit:
wenn ich nun die Zeit zwischen 17:00 und 6:00 erfassen will,
dann muss ich das ja so machen:
wenn Zeit ≥17:00 oder ≤ 6:00.
Grund für das ODER hier ist:
Es wird verglichen auf größer 17. Nach 0:00 Uhr ist diese Bedingung ja nicht mehr WAHR.
Es wird verglichen auf kleiner gleich 6. Diese Bedingung ist WAHR von 0:00 bis 6:00 Uhr.
Was ich damit sagen will: Es wird nicht automatisch nach Uhrzeit berechnet, sondern rein nach "Zahlen" wie 17 oder 6 ? Wird hier wie bei Excel mit internen Zahlen gerechnet oder UNIX Zeit?
Hallo,
Es wird nicht automatisch nach Uhrzeit berechnet, sondern rein nach "Zahlen"
Eigentlich werden hier lediglich Zeitspannen miteinander verglichen. In der Uhrzeit steckt ja keine Information über den Tag bzw. Tageswechsel.
6:00 kann eben genausogut am gleichen Tag wie die 17:00 liegen, oder eben am nächsten Tag.
Die Reihenfolge in der Du die Werte vergleichst kann und darf hier keine Rolle spielen.
Ob also ein Tageswechsel vorliegt, musst Du daher in irgendeiner Weise selbst entscheiden.
Möglich wäre z.B. auch, sich ein fixes Datum zu nehmen und dann mit dem vollständigen DateTime (nicht TimeSpan) Differenzen zu dem fixen Datum zu bilden (die dann doch wieder ein TimeSpan sind, der aber dann die Information über den Tageswechsel schon enthält), das halte ich aber für ungleich komplizierter.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Ob ein Tageswechsel vorliegt oder nicht, spielt im Prinzip keine Rolle.
Die Datei hat ca. 100 000 Datensätze und ich benötige nur einige hunterte bestimmte, wie z.B. die nach 17 Uhr und/oder die vor 6:00 Uhr.
Oder die zwischen 6:00 und 17:00 Uhr usw.
Das habe ich m.Mn.nach mit der Abfrage ≥17:00 ODER ≤ 6:00 erschlagen, unabhängig vom Tag.
Was meinst Du?
Hallo,
_wenn _der Tag tatsächlich keine Rolle spielt, passt das auf jeden Fall.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca