Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Datatable mit DateTime nach Uhrzeit filtern - Welchen Select absetzen?
schuppsl
myCSharp.de - Member



Dabei seit:
Beiträge: 784

Themenstarter:

Datatable mit DateTime nach Uhrzeit filtern - Welchen Select absetzen?

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von schuppsl am .
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.163
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,
Zitat
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MarsStein am .
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 985

beantworten | zitieren | melden

@MarsStein

Jetzt noch den Monat in die LINQ Abfrage und dann ist es wie gewünscht
private Nachricht | Beiträge des Benutzers
schuppsl
myCSharp.de - Member



Dabei seit:
Beiträge: 784

Themenstarter:

beantworten | zitieren | melden

Hallo MarsStein,

vielen Dank.
Es war natürlich 'or' gemeint.

Das dtClone ist eine Datatable, Rows dann die DataRowCollection, es kommt daher die Meldung:
Zitat

'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?).
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.163
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
schuppsl
myCSharp.de - Member



Dabei seit:
Beiträge: 784

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.163
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
schuppsl
myCSharp.de - Member



Dabei seit:
Beiträge: 784

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.163
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,
Zitat
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
private Nachricht | Beiträge des Benutzers
schuppsl
myCSharp.de - Member



Dabei seit:
Beiträge: 784

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.163
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
schuppsl
myCSharp.de - Member



Dabei seit:
Beiträge: 784

Themenstarter:

beantworten | zitieren | melden

Das denke ich auch, vielen Dank.
Sehr interessant :)
private Nachricht | Beiträge des Benutzers