![]() |
Abfrage mit Daumswechsel
Hi
Habe bissher folgenden Code:
Delphi-Quellcode:
Hier wird jetzt die Anzahl der Datensätze ausgegeben bei denen in der Spalte "Order_type" FT steht.
var
anzahl : Integer; begin dbMain.HostName:=Form2.Hostname.Text; //Server dbMain.User:=Form2.User.Text; //Benutzername dbMain.Password:=Form2.Password.Text; //Passwort dbMain.Database:=Form2.Datenbank.Text; //Name der Datenbank dbMain.Connected:=True; //Verbindung herstellen Screen.Cursor := crHourGlass; try with qrMain do begin Close; SQL.Text := 'SELECT COUNT(*) AS anzahl FROM table_ordertracking WHERE order_type=:order_type'; ParamByName('order_type').AsString := 'FT'; Open; anzahl := FieldByName ('anzahl').AsInteger; DFCount.Text:= IntToStr(anzahl); qrmain.Close; finally Screen.Cursor := crdefault; end; end; In der Tabelle ist ein Date/Time Feld. Jetzt möchte ich das ganze aber über einen Zeitraum von 19:00 Uhr bis 19:00 Uhr haben. Z.B: 05.05.04 19:00Uhr - 06.05.04 19:00Uhr. Also demnach dann ab 06.05.04 19:00:01 wieder 06.05.04 19:00 - 07.05.04 19:00 usw. Das ganze soll so zusagen ein Counter werden, der alle Datensätze des Types FT von zb. 05.05.04 19:00Uhr - 06.05.04 19:00Uhr hochzählt. Am 06.05.04 19:00:01 geht das denn wieder von vorne los. Ist so etwas überhaup möglich :?: Gruß Celina |
Re: Abfrage mit Daumswechsel
Hallo,
etwa in der Art:
Code:
'SELECT
COUNT(*) AS anzahl FROM table_ordertracking WHERE order_type=:order_type AND datum BETWEEN (:von AND :bis)'; |
Re: Abfrage mit Daumswechsel
In diesem Fall wäre BETWEEN wohl nicht geeignet da es ja die "begrenzungswerte" mit einschließt (>= AND <=).
Somit würde bei 1.5.2004 19:00 bis 2.5.2004 19:00 2.5.2004 19:00 bis 3.5.2004 19:00 Der Zeitstempel 2.5.2004 19:00 in beiden Abfragen berücksichtigt werden. Ich würde abfragen: (datum > 1.5.2004 19:00) AND (datum <= 2.5.2004 19:00). Dann müsste es eigentlich stimmen.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var anzahl : Integer; von : TDateTime; bis : TDateTime; begin von := EncodeDateTime(2004,5,1,19,00,00,00); //1. Mai 2004 19:00 bis := EncodeDateTime(2004,5,2,19,00,00,00); //2. Mai 2004 19:00 dbMain.HostName:=Form2.Hostname.Text; //Server dbMain.User:=Form2.User.Text; //Benutzername dbMain.Password:=Form2.Password.Text; //Passwort dbMain.Database:=Form2.Datenbank.Text; //Name der Datenbank dbMain.Connected:=True; //Verbindung herstellen Screen.Cursor := crHourGlass; try with qrMain do begin Close; SQL.Text := 'SELECT COUNT(*) AS anzahl '+#10+ 'FROM table_ordertracking '+#10+ 'WHERE (order_type=:order_type)'+#10+ 'AND (datum > :von) AND (datum <= :bis)'; ParamByName('order_type').AsString := 'FT'; ParamByName('von').AsDateTime := von; ParamByName('bis').AsDateTime := bis; Open; anzahl := FieldByName ('anzahl').AsInteger; DFCount.Text:= IntToStr(anzahl); qrmain.Close; finally Screen.Cursor := crdefault; end; end; |
Re: Abfrage mit Daumswechsel
Hallo,
@Sharky: Wo ist das Problem? von: 06.05.04 19:00:01 bis: 07.05.04 19:00:00 Siehe auch Posting von celinaw. |
Re: Abfrage mit Daumswechsel
Zitat:
Zitat:
Wenn z.B.: Ein Eintrag um 19:00:01:59 erfolgt gibt es ein Problem. |
Re: Abfrage mit Daumswechsel
Hi :hi:
Also ich denke ganz so einfach wird es nicht sein. Ich möchte hier kein festes Datum vorgeben. Das Programm soll mit dem System Datum/Zeit arbeiten. Also so: Übrigens: Die Abfrage wird über einen Timer alle 2min aktualliesert. Wenn der Timer am Datum/Zeit z.B 17.05.2004 20:30 Uhr startet, müsste die Abfrage folgenden Zeitraum abdecken: von: 17.05.2004 19:00 Uhr bis: 18.05.2004 19:00 Uhr !! Der Haken an der Sache ist, dass wenn der Timer nach OO:00 Uhr und vor 19:00 Uhr startet, müsste die Abfrage bei oben genanntem Beispiel mit folgenden Parameter laufen: von: 17.05.2004 19:00 Uhr bis: 18.05.2004 19:00 Uhr !! Ich brauche also immer den Zeitraum 19:00 Uhr bis 19:00 Uhr. Und das ist ja davon abhängig wann die Abfrage ausgeführt wird. Wird die Abfrage zwischen 19:00 Uhr und 00:00 Uhr ausgeführt, solten die Abfrage Parameter von 19:00 Uhr des Aktuellen Tages bis 19:00 Uhr des folgenden Tages sein. Nach 00:00 Uhr und vor 19:00 müssen die Parameter ja dann von 19:00 Uhr des vergangenen Tages bis 19:00 Uhr des Aktuellen Tages sein. Ich hoffe da blickt noch einer durch :gruebel: :oops: Ich denke das ist nicht so leicht zu machen :?: @ Sharky Zitat:
Gruß Celina |
Re: Abfrage mit Daumswechsel
Hi Celina!
Wie ich sehe ist Dein Problem weitgehend gelöst. Was übrig bleibt, ist das richtige Setzen der Zeitgrenzen. Ich hoffe, dass das folgende Stück Code Dir weiterhelfen wird:
Delphi-Quellcode:
Viele Grüße
VonDatumZeit := Date() + EncodeTime(19,00,00,00);
BisDatumZeit := VonDatumZeit; DecodeTime(Now, Hour, Min, Sec, MSec); if Hour >= 19 then BisDatumZeit := BisDatumZeit + 1 else VonDatumZeit := VonDatumZeit - 1; Markus :gruebel: |
Re: Abfrage mit Daumswechsel
Hai Celinachen *gg*,
ich habe das ganze mal so gemacht. Ich weiss das man es auch noch vereinfachen kann. Aber ich denke so ist die "Logik" besser zu erkennen?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var sod: TTime; // Start of day sop: TTime; // Start of production datum: TDate; // Datum des Servers zeit: TTime; // Zeit des Servers DayOffsetStart: Integer; // 0 = heute; -1 = Gestern DayOffsetEnde: Integer; // 0 = heute; 1 = Morgen VonDatumZeit: TDateTime; // Abfrage start BisDatumZeit: TDateTime; // Abfrage ende begin sod := EncodeTime(0, 0, 0, 0); // 00:00:00 // Neuer Tag neues Glück sop := EncodeTime(19, 0, 0, 0); // 19:00:00 // Die Arbeit beginnt dbMain.HostName := Form2.Hostname.Text; //Server dbMain.User := Form2.User.Text; //Benutzername dbMain.Password := Form2.Password.Text; //Passwort dbMain.Database := Form2.Datenbank.Text; //Name der Datenbank dbMain.Connected := True; //Verbindung herstellen Screen.Cursor := crHourGlass; try with qrMain do // Ersteinmal Datum und Zeit vom Server holen. begin Close; SQL.Text := 'SELECT CURDATE() AS datum, CURTIME() as zeit'; Open; datum := FieldByName('datum').AsDateTime; zeit := FieldByName('zeit').AsDateTime; Close; end; // Jetzt prüfen welche Zeiträume berücksichtigt werden müssen. if (zeit >= sod) and (zeit < sop) then // Es ist zwichen 00:00:00 und 19:00:00 begin DayOffsetStart := -1; // Abfrage beginnt gestern DayOffsetEnde := 0; // Abfrage endet heute end else //Es ist zwichen 19:00:00 und 23:59:59 begin DayOffsetStart := 0; // Abfrage beginnt Heute DayOffsetEnde := 1; // Abfrage endet Morgen end; // Start- und Endzeitpunkte berechnen VonDatumZeit := datum + sop + DayOffsetStart; BisDatumZeit := datum + sop + DayOffsetEnde; with qrMain do // Und los geht es begin Close; SQL.Text := 'SELECT COUNT(*) AS anzahl '+#10+ 'FROM table_ordertracking '+#10+ 'WHERE (order_type=:order_type)'+#10+ 'AND (datum > :von) AND (datum <= :bis)'; ParamByName('order_type').AsString := 'FT'; ParamByName('von').AsDateTime := VonDatumZeit; ParamByName('bis').AsDateTime := BisDatumZeit; Open; anzahl := FieldByName ('anzahl').AsInteger; DFCount.Text:= IntToStr(anzahl); qrmain.Close; finally Screen.Cursor := crdefault; end; end; |
Re: Abfrage mit Daumswechsel
Hi Hai :mrgreen:
Na das werde ich gleich mal testen :zwinker: Erst mal Vielen Dank :thuimb: Melde mich gleich wieder.. @MarkusB Dir danke ich natürlich auch :thuimb: Gruß Celina |
Re: Abfrage mit Daumswechsel
Hi Hai :mrgreen:
:shock: Wow... Respekt!! :thuimb: Es funktioniert auf anhieb! Das hast du Spuper hin bekommen :thuimb: Und ganz besonders toll finde ich es, das du den Code mit nützlichen Kommentaren versehen hast! So kann jeder verstehen was du da gemacht hast, selbst ich :oops: Du hast dir ein DICKES Lob verdient!! :mrgreen: @MarkusB: Natürlich danke ich auch dir für deine Mühe. Also, vielen vielen Dank! Ein :cheers: auf die DP :thuimb: Liebe Grüße Celina |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz