Laden...

Datatable mit DateTime nach Uhrzeit filtern - Welchen Select absetzen?

Erstellt von schuppsl vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.899 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 7 Jahren
Datatable mit DateTime nach Uhrzeit filtern - Welchen Select absetzen?

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?

3.170 Beiträge seit 2006
vor 7 Jahren

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

D
985 Beiträge seit 2014
vor 7 Jahren

@MarsStein

Jetzt noch den Monat in die LINQ Abfrage und dann ist es wie gewünscht 👍

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 7 Jahren

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?).

3.170 Beiträge seit 2006
vor 7 Jahren

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

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 7 Jahren

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.

3.170 Beiträge seit 2006
vor 7 Jahren

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

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 7 Jahren

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?

3.170 Beiträge seit 2006
vor 7 Jahren

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

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 7 Jahren

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?

3.170 Beiträge seit 2006
vor 7 Jahren

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

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 7 Jahren

Das denke ich auch, vielen Dank.
Sehr interessant 😃