SQL Abfrage Zeit und Datum (Access DB)



  • Hallo leute,

    ich ahbe ein programm, wo ich aus einer Access DB sachen auslese!
    Bisher habe ich nur nach datum gefilter, das klappt wunderbar!

    Jetzt brauch ich allerdings noch die zeiten!
    In der Access DB ist das Feld so aufgebaut:
    TT.MM.JJJJ HH:MM:SS

    die Abfrage welche Access generiert (mit Abfrageassistent) sieht so aus:
    #1/10/2006 9:21:0#
    also #T/MM/JJJJ H:MM:S#

    wollte nun meinen SQL Befehl zusammen bauen:

    String highstarttime = limits->ReadString("HIGH","STARTTIME","0:00");
                //ShowMessage(highstarttime);
                //Baue Select zusammen
                select += ComboBox1->Text;
                select += " AND (mw_Zeit >= #";
                select += realpicker;       //startdatum im format TT/MM/JJJJ
                //select += "\"";
                select += " ";
                select += highstarttime;    //Zeit im Format H:MM:S
                select += "# AND mw_Zeit <= #";
                select += realpicker2;      //enddatum im format TT/MM/JJJJ
                //select += "\"";
                select+= "#)";
    

    wenn ich mir den string ausgeben lasse, sieht er aus wie im access, allerdings bekomme ich eine Exception:
    "Ein Parameterobjekt ist nicht ordnungsgemäß definiert!Inkonsistente oder unvollständige Informationen wurden angegeben!"

    wenn ich dieses highstarttime weglasse, geht es ohne probleme!

    die zeiten realpicker und realpicker2 hole ich mir ais DateTimePicker und bringe sie als String in das format TT/MM/JJJJ.
    Die abfrage läuft durhc ein ADOQuery!

    Wer kann mir helfen damit es funktioniert?



  • die Fehlermedlung liegt wahrscheinlich an den Doppelpunkten in deinem Query-String, da Doppelpunkte als Definition für Parameter gelten

    eine Möglichkeit ist die Werte für Datum und Zeit als Parameter zu übergeben:

    String highstarttime = limits->ReadString("HIGH","STARTTIME","0:00");
                //ShowMessage(highstarttime);
                //Baue Select zusammen
                select += ComboBox1->Text;
                select += " AND (mw_Zeit >= :Startdatum";
                //select += realpicker;       //startdatum im format TT/MM/JJJJ
                //select += "\"";
                select += " ";
                //select += highstarttime;    //Zeit im Format H:MM:S
                select += " AND mw_Zeit <= :Enddatum";
                //select += realpicker2;      //enddatum im format TT/MM/JJJJ
                //select += "\"";
                select+= ")";
    ADOQuery->Parameters->ParamByName("Startdatum")->Value = realpicker + highstarttime; //als TDateTime !!!
    ADOQuery->Parameters->ParamByName("Enddatum")->Value = realpicker2 ; //als TDateTime !!!
    

    die andere Alternative ist ParamCheck vom ADOQuery auf false setzten, dadurch werden dann alle Parameter ignoriert



  • das problem ist, als DAteTime geht es nicht, da Access es in dem Format will:
    #TT/MM/JJJJ H:M:S#

    kann ich die parameter auch normal als string benutzen?



  • die Parameter haben den Vorteil, daß sie das Format automatisch so anpassen, dass die Datenbank damit arbeiten kann, d.h. falls du mal eine andere (richtige) Datenbank verwendest brauchst du das Format nicht neu angeben

    also versuchs doch einfach mal



  • ok, hab das jetzt so versucht:

    TDateTime highstart =  MaskEdit1->Date;
                TDateTime highend = DateTimePicker1->Date;
    
                //ShowMessage(highstarttime);
                //Baue Select zusammen
                select += ComboBox1->Text;
                select += " AND (mw_Zeit >= :Startdatum";
                //select += realpicker;
                //select += "\"";
                select += " ";
                //select += highstarttime;
                select += "AND mw_Zeit <= :Enddatum";
                //select += realpicker2;
                //select += " ";
                //select += highendtime;
                select+= ")";
    
                ShowMessage(select);
                //ShowMessage(ADOQuery1->SQL->Text);
                ADOQuery1->Parameters->ParamByName("Startdatum")->Value =  highstart;
                ADOQuery1->Parameters->ParamByName("Enddatum")->Value = highend;
    

    leider bringt er beim ausführen, das er die paramter nicht finden kann!
    was mache ich falsch?



  • TDateTime highstart =  MaskEdit1->Date;
    TDateTime highend = DateTimePicker1->Date;
    
    select += ComboBox1->Text; // schon fragwürdig, da nicht gezeigt wird, was in der CB steht und auch nicht, was bereits in select steht
    select += " AND (mw_Zeit >= :Startdatum";
    select += " ";
    select += "AND mw_Zeit <= :Enddatum";
    select+= ")";
    // wäre kürzer mit "AND (mw_Zeit BETWEEN :Startdatum AND :Enddatum)"
    
    // hier fehlt die Stelle, wo die SELECT-Anweisung dem Query zugewiesen wird
    ADOQuery->SQL->Text = select;
    ADOQuery1->Parameters->ParamByName("Startdatum")->Value =  highstart;
    ADOQuery1->Parameters->ParamByName("Enddatum")->Value = highend;
    

    Ich würd also sagen, dass Du einfach nur vergessen hast, der Query den Select auch zuzuweisen...



  • ok, er bringt keine fehler:

    limits = new TIniFile(ExtractFilePath(Application->ExeName)+"limits.ini");
                            TTime highstarttime = limits->ReadDateTime("HIGH","STARTTIME",StrToDateTime("00:00:00"));
                            TTime highendtime = limits->ReadDateTime("HIGH","ENDTIME",StrToDateTime("00:00:00"));
    
                            TDateTime highstart =  MaskEdit1->Date;
                            TDateTime highend = DateTimePicker1->Date;
    
                            ADOQuery1->Close();
                            ADOQuery1->SQL->Clear();
                            ADOQuery1->SQL->Text=select;
    
                            ADOQuery1->Parameters->ParamByName("Startdatum")->Value =  highstart + highstarttime;
                            ADOQuery1->Parameters->ParamByName("Enddatum")->Value = highend + highendtime;
    

    allerdings möchte ich bei highstart und highend nur das datum ohne zeit aus dem picker bekommen, ich bekomme aber irgendwie alles!

    und zu diesem datum möchte ich dann die zeiten aus highstarttime und highendtime ranbastel!
    Beispiel:

    highstart sollte nur 14.02.2007 sein, und daran möchte ich die zeit aus highstartime 11:02:56, das es dann so aussieht 14.02.2007 11:02:56!

    Muss ich dazu erst alles in string casten, ändern und dann wieder urück nach DateTime?



  • der ganzzahlige Anteil von TDateTime ist das Datum, der Rest ist die Zeit
    TDateTime ist eigentlich ein float/double-Wert, der die Tage seit dem 01.01.1900 beinhaltet



  • Du kannst einem TDateTime Datum und Uhrzeit getrennt zuweisen. Es spricht also nichts dagegen, nur das Datum aus dem DateTimePicker zu verwenden und die Time-Eigenschaft des TDateTimes später zu setzen.



  • Joe_M. schrieb:

    Du kannst einem TDateTime Datum und Uhrzeit getrennt zuweisen. Es spricht also nichts dagegen, nur das Datum aus dem DateTimePicker zu verwenden und die Time-Eigenschaft des TDateTimes später zu setzen.

    Und wie mache ich das, mit welcher funktion?



  • z.B.:

    TDateTime Test;
    Test = TDateTime(2007, 2, 14); // Datum setzen
    Test.Val = Test.Val + TDateTime(13, 50, 33, 0).Val; // Zeitanteil hinzuaddieren
    

Anmelden zum Antworten