Probleme mit Datum Filter in SQL



  • Hallo,

    in meinem Programm habe ich eine Access Datenbank die ich mit SQL filter.
    In dieser Datenbank gibt es eine Spalte die "Datum" heißt und in der auch ein Datum drin steht.
    nun möchte ich meine Datenbank mit dem Datum Filtern, dafür benutze ich zwei DateTimePcker. Mein Quellcode sieht so aus:

    String Datum_Von;
    String Datum_Bis;
    
    Datum_Von=DateTimePicker_Von->Date;
    Datum_Bis=DateTimePicker_Bis->Date;
    
    Query1->Close();
    Query1->SQL->Clear();
    Query1->SQL->Add("SELECT * FROM Tabelle1 WHERE Datum >= '"+AnsiString(Datum_Von)+"' AND Datum <= '"+AnsiString(Datum_Bis)+"' ORDER BY ID");
    Query1->Open();
    

    Der Fehler ist nun, wenn ich z.B. im DateTimePicker_Von den 12.11.2006 und im DateTimePicker_Bis den 16.11.2006 auswähle, dann zeigt er mir zwar auch nur die Einträge vom 12. - 16 an, aber nicht nur die im November sondern auch in allen anderen Monaten.
    Das heißt das SQL nur den Tag Wert filtert.

    Wo liegt mein Fehler???



  • wenn das Datenbankfeld vom Typ Datum/DateTime ist solltest du die Werte auch so übergeben und nicht als String

    eine Möglichkeit ist die Verwendung von Parametern

    TDateTime von = DateTimePicker_Von->Date;
    TDateTime bis= DateTimePicker_Bis->Date;
    ...
    Query1->SQL->Add("SELECT * FROM Tabelle1 WHERE Datum >= :von AND Datum <= :bis ORDER BY ID");
    //oder
    //Query1->SQL->Add("SELECT * FROM Tabelle1 WHERE Datum between :von AND :bis ORDER BY ID");
    Query1->ParamByName("von")->AsDateTime = von;
    Query1->ParamByName("bis")->AsDateTime = bis;
    Query1->Open();
    


  • Ich seh so direkt keinen Fehler, allerdings ist das direkte Einfügen von Datumswerten in einen SQL-Select immer mit einem gewissen Risiko verbunden.

    Verwende besser Parameter. Dadurch wird sichergestellt, dass das Datum korrekt interpretiert wird.

    Query1->Close();
    Query1->SQL->Clear();
    Query1->SQL->Add("SELECT * FROM Tabelle1 WHERE Datum >= :DatumVon AND Datum <= :DatumBis ORDER BY ID");
    Query1->ParamByName("DatumVon")->AsDateTime = DateTimePicker_Von->Date;
    Query1->ParamByName("DatumBis")->AsDateTime = DateTimePicker_Bis->Date;
    Query1->Open();
    

Anmelden zum Antworten