Zeitstempel in Datumsangabe während SQL-Abfrage entfernen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von MemoAnMichSelbst.

    Zeitstempel in Datumsangabe während SQL-Abfrage entfernen

    Hallo,

    mein Problem lautet wie folgt: In einer Datenbank werden Messreihen
    gespeichert und dabei für jede Messreihe das Datum im Format „2015-11-02
    11:07:00“ hinterlegt. Für einen Datenfilter benötige ich ausschließlich das
    Datum, nicht aber den Zeitstempel. Wie kann ich es realisieren, dass ich
    entweder:

    - in meiner SQL-Abfrage die Datums-Spalte so formatiere, dass ich mir ausschließlich
    die Daten (lt. Duden die Mehrzahl von Datum ;) ) ohne die Zeitstempel in mein
    DataSet/DataTable lade

    - oder mir die Daten erst im Original in mein DataSet/DataTable ziehe und dort den Zeitstempel
    entferne?

    Für jeden Hinweis wäre ich sehr dankbar und dies ist im Übrigen mein erster Eintrag hier im Forum ;)

    MfG
    Refra

    Refratechnik schrieb:

    das Datum im Format „2015-11-02 11:07:00“
    angezeigt oder abgespeichert?
    Wahrscheinlich ist die Spalte sogar vom Typ DateTime.
    Dann kannst du auch die entsprechende DB-Funktion in die Abfrage einbauen.

    Wekches DB-System?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Du lädst die Daten in dein Dataset?
    Wie?
    Ist es ein typisiertes Dataset? Du kannst doch den Zeitstempel bei einem Filter ignorieren. Hier musst du in VB doch nur die Abfrage auf die Datatable doch nur anpassen.
    Ich würde die Daten genau so in das Dataset laden wie sie in der DB sind und innerhalb deines Filters (hierzu weiß ich bislang noch nicht wie du aktuell filterst) die Abfrage so bauen, dass nur das "Datum" genutzt wird und nicht die Uhrzeit.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Es ist kein typisiertes DataSet. Ok, aktuell ist es so, dass ich mir über einen DataAdapter die Daten hole (lediglich eine Tabelle) und damit eine DataTable fülle. Anschließend weise ich der Tabelle einen DataView zu (wegen der RowFilter-Eigenschaft) und nutze letzteres als BindingSource für ein DataGridView. Mit dem Datenfilter, den ich eingangs erwähnte, meinte ich einen selbst gebastelten Filter, um quasi die in dem DGV dargestellten Daten live zu filtern.

    Bei der Datenbankabfrage filtere ich aktuell also gar nichts und hole mir die Daten so wie sie sind. Du meinst also, dass ich bei dem Schritt des Füllens meines DataTables einen entsprechenden Filter einbauen sollte bzw. könnte? Oder kann ich das direkt in meiner SQL-Abfrage umsetzen, indem ich bei einer Spalte vom Typ DateTime mir nur das Datum raushole, ohne den Zeitstempel?

    Vielen Dank schonmal!
    Naja du kannst im SQL Statement natürlich eine Spalte in ein beliebiges Format parsen. Je nachdem was du vorhast, hast du beim zurückschreiben von Änderungen dann ein Problem, weil die Daten von Datatable und Datenbankdabelle abweichen.
    Du kannst dem SQL Statement natürlich ohne Probleme nen Filter mitgeben. Die Where Funktion im SQL Statement ist sehr mächtig. Dann lädst du nur die relevanten Daten aus der Datenbank und kannst das Format lassen wie es ist. Das ist denke ich immer sauber, weil Datatable und Datenbank die gleichen Daten enthalten und somit Updates usw. auch einfach zu realisieren sind.
    Da ich aktuell aber noch gar nicht sehe was du da an Quellcode hast, ist es schwer Hilfestellung zu geben.

    Was du bedenken musst ist, dass wenn du zwei Datensätze hast, die bis auf die Uhrzeit identisch sind (je nach Inhalt der Tabelle ja durchaus realistisch) könnte durch das Ändern des Formates beim Einlesen natürlich so aussehen, als gäbe es Duplikate, die garkeine sind.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Also mir den Zeitstempel direkt in der SQL-Abfrage entfernen zu lassen war ganz einfach:

    "SELECT TOP 1000 [ID], CAST(Datum AS DATE) AS Datum, …”

    Wie sauber die Anweisung ist, kann ich nicht einschätzen, es klappt jedenfalls ;) Allerdings musste ich feststellen,
    dass dieser Ansatz gar nicht das ist, was ich wollte (trotzdem habe ich natürlich etwas gelernt dabei, danke).

    Ich muss mein Problem nun spezifizieren. In meinem DGV
    möchte ich das Datum mit dem Zeitstempel anzeigen lassen! Für meinen Filter benutze
    ich zwei DateTimePicker, mit denen ich mir das Datum „von“ und das Datum „bis“
    auswähle (ohne Uhrzeit):

    VB.NET-Quellcode

    1. Dim StartDatum As DateTime
    2. Dim EndDatum As DateTime
    3. StartDatum = dtpFilterVon.Value.Date
    4. EndDatum = dtpFilterBis.Value.Date
    5. If EndDatum < StartDatum Then
    6. lblDatumFilterFehler.Text = "Enddatum liegt vor Startdatum, bitte Eingabe korrigieren!"
    7. ElseIf StartDatum = EndDatum Then
    8. Dataview1.RowFilter = "Datum = '" & StartDatum & "'"
    9. lblDatumFilterFehler.Text = "Elseif!"
    10. Else
    11. Dataview1.RowFilter = "Datum >= '" & StartDatum & "'" & "AND Datum <= '" & EndDatum & "'"
    12. lblDatumFilterFehler.Text = "Eingabe ok!"
    13. End If
    14. Dataview1.Sort = "Datum ASC"


    Das Problem liegt im ElseIf-Zweig, wenn ich mir quasi nur
    die Messungen von einem Tag anzeigen lassen möchte: hier vergleiche ich eine
    reine Datumsangabe mit der Datumsangabe + Zeitstempel im DataView – kann halt
    nicht gleich sein. Wenn ich von .. bis das selbe Datum angebe, wird mir
    entsprechend nichts angezeigt.

    Ich möchte also im DGV die Originaldarstellung (Datum +
    Zeit) und im Filter aber nur das Datum berücksichtigen. Filtere ich von … bis
    das selbe Datum, sollen mir halt alle Datensätze von diesem Tag angezeigt
    werden. Hierfür fehlt mir bislang ein Lösungsansatz :)
    Dann sag deiner Where Klausel doch auch einfach, er soll Datum umformatieren bevor du es vergleichst.
    zB. so:

    SQL-Abfrage

    1. SELECT * FROM Blubberdiblab WHERE cast([Datum] AS date) = '01/01/2018'


    EDIT:
    Theoretisch müsstest du damit auch garkeine Unterscheidung machen ob Start und Enddatum gleich oder unterschiedlich sind. Durch das >= und <= passt es eh.

    SQL-Abfrage

    1. SELECT * FROM Blubberdiblab WHERE cast([Datum] AS date) >= '01/01/2018' AND cast([Datum] AS date) <= '01/01/2019'
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D