Announcement

Collapse
No announcement yet.

SQLite String in Date

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQLite String in Date

    Ich arbeite mit einer SQLite Datenbank. In einer Tabelle befindet sich eine Spalte (VarChar, 10) dort speichere ich Strings als Datum (12.01.2008).
    Diese Strings möchte ich als Date weiterverarbeiten um zum beispiel Between bei mehreren Daten zu suchen. Kann ich diese Stings (12.01.2008) in einem DataTable von String in Date umwandel und wie realisiere ich die Filterung.
    Danke

  • #2
    Hallo,

    Du merkst, dass Strings als Datumsersatz in einer Datenbank sehr schnell zu Problemen führen.

    Du solltest also, wenn es irgendmöglich ist, die Ursache des Problems beseitigen und nicht die Folgeprobleme zu behandeln. Die Ursache wird durch Änderung der DB beseitigt, z.B. so:
    Code:
    //  1. Befehl
    ALTER TABLE MyTable ADD COLUMN DateColumn AS DATE;
    //  2. Befehl ungefähr
    UPDATE MyTable
    SET DateColumn = CAST(VarCharColumn AS DATE);
    //  3. Befehl
    ALTER TABLE MyTable DROP VarCharColumn;
    Wahrscheinlich funktioniert CAST so nicht, weil ein "deutsches" Datum von SQLite nicht als Datum erkannt wird. Dann ist der Befehl durch eine Kombination von SUBSTRING und "+" und CAST zu ersetzen. Einzelheiten dazu stehen in der Dokumentation von SQLite.

    Wenn Du die Ursache nicht beseitigen kannst/darfst, hast Du mindestens drei Möglichkeiten:
    1. Benutze den CAST (ggf. in der genannten Kombination) als Teil des SELECT-Befehls:
      Code:
      SELECT ID, CAST(VarCharColumn AS DATE) AS DateColumn
      FROM MyTable
      WHERE DateColumn BETWEEN "@param1" AND "@param2";
    2. Füge in der Ziel-DataTable ein berechnetes Feld ein, das aus dem String ein DateTime macht. Einzelheiten dazu findest Du in der SDK-Doku/MSDN unter DataColumn.Expression mit den Begriffen CONVERT und SUBSTRING.
    3. Wenn die Daten per DataReader geholt werden, kann der String mit DateTime.ParseExact und einer passenden Überladung mit FormatProvider oder Format-String konvertiert werden.

    Du siehst: Die Ursache zu beseitigen, ist auf jeden Fall einfacher.

    Bei den Möglichkeiten 2 und 3 kann der Ersatz für BETWEEN erst nach dem Abholen "aller" Daten vorgenommen werden, z.B. durch Filtern mit DataView oder eine if-Abfrage beim DataReader.

    Bitte beachte auch, dass ein SQL-Befehl niemals per String-Verknüpfung erstellt werden sollte, sondern immer mit Parameters, wie in meinem Beispiel. Einzelheiten dazu findest Du unter SqlCommand.Parameters sowie in der Doku des SQLite-Providers.

    Viel Erfolg! Jürgen

    Nachtrag: Es geht natürlich auch manuell in der DataTable: neue DateTime-Spalte hinzufügen, in einer Schleife über alle Rows den Wert mit DateTime.TryParse anpassen, dann mit DataView filtern. Das dürfte das langsamste und umständlichste Verfahren sein.

    Comment


    • #3
      Danke

      Hallo Jürgen,
      danke für die Antwort. Ich komme aus der Borland C++ Welt und habe mich nach langem Überlegen zu SQLite entschieden. Darum tue ich mich noch sehr schwer.
      Ich komme nicht so richt mit der Datumsabfrage in SQLite klar. Ich möchte aus der Tabelle ein ganzes Jahr etwa 2007 auswählen. Ich schaffte es einfach nicht. Also bin ich auf LIKE umgestigen und suche eben nach dem String '.2008'. Ist keine schöne Art :-(. Aber ich wußte nicht weiter.

      Nochmals Danke

      Comment

      Working...
      X