Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Befehl zum Ausgeben von daten in einen bestimmten Bereic (https://www.delphipraxis.net/25099-sql-befehl-zum-ausgeben-von-daten-einen-bestimmten-bereic.html)

Kruemel2oo2 1. Jul 2004 07:51


SQL Befehl zum Ausgeben von daten in einen bestimmten Bereic
 
Hio könnte mir mal bitte einer sagen wie der Befehl für SQl ist um einen bestimmten Bereich auszugeben also z.B. Bereich von 23.11.2003 - 25.11.2003 <<< diesen Bereich möchte ich nur sehn.

gruß Kruemel

Bernhard Geyer 1. Jul 2004 08:16

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
select * from MeineTabelle
where MeinDatumsfeld => '23.11.2003' and MeinDatumsfeld <= '25.11.2003'

Je nach DB-System und genauen Feld-Typ muss evtl noch die Zeit mit angegeben werden '23.11.2003 00:00:00' bzw. mit Raute getrennt werden (M$ Access) #23.11.2003#.

Kruemel2oo2 1. Jul 2004 08:26

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
em kann man dies auch in Kombination machen also ich habe eine Datenbank bzw Tabelle wo ich TAG Monat unfd Jahr einazlnt drin hab. würde das denn auch so gehn. Select from Table where Tag => '...' AND TAG <= '...' AND Monat => '...' AND Monat <= '...' AND Jahr =>'...' AND Jahr <= '...'

?? also ich hab zumindestens getestest aba es funzt net aba kann ja sein ich mach was falsch.

Sharky 1. Jul 2004 08:31

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Hai Kruemel2002,

versuche es mal so:
SQL-Code:
SELECT * FROM tabelle
WHERE (tag BETWEEN start AND ende)
 AND (monat BETWEEN start AND ende)
 AND (jahr BETWEEN start AND ende)

Kruemel2oo2 1. Jul 2004 08:43

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
hmm funzt uch net ... ich mein ich mach das ja über delphi und will das in ner QuickRep ausgeben.

so sieht das bei mir aus:
Delphi-Quellcode:
Form1.Query1.SQL.Add('select * from Booking where (Tag between"'+Tag1+'"AND "'+Tag2+'")AND(Monat between"'+Monat+'"AND"'+Monat1+'") AND (Jahr between"'+Jahr+'"AND"'+jahr1+'") order by name, Uhrzeit');
könnte sein das da nen fehler drin ist

[edit=sakura] [source]Tags haben wir nicht, aber [delphi] Mfg, sakura[/edit]

Kruemel2oo2 1. Jul 2004 08:53

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
[edit=sakura] [source]Tags haben wir nicht, aber [delphi] Mfg, sakura[/edit] <<< verstehe ich net

Sharky 1. Jul 2004 09:29

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Hai,

versuche es mal so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Query1 do
  begin
    Close;
    SQL.Text := 'SELECT * FROM booking' +#10
      + 'WHERE (tag BETWEEN :tag1 AND :tag2)' + #10
      + 'WHERE (moat BETWEEN :monat AND :monat2)' + #10
      + 'WHERE (jahr BETWEEN :jahr1 AND :jahr2)' + #10
      + ' ORDER BY name, uhrzeit';
    ParamCheck := True;
    Params.ParamByName('tag1').Value := Tag1;
    Params.ParamByName('tag2').Value := Tag2;
    Params.ParamByName('monat1').Value := Monat1
    Params.ParamByName('monat2').Value := Monat2
    Params.ParamByName('jahr1').Value := Jahr1
    Params.ParamByName('jahr2').Value := Jahr2;
    Open;
  end;
end;
P.S.: Ich denke Sakura meinte das die Tags nicht [ source] [ /source] heissen sondern [ delphi] [ /delphi] (Natürlich ohne die Leerzeichen)

DP-Maintenance 1. Jul 2004 09:30

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Programmieren allgemein" nach "Datenbanken" verschoben.
Ist in der Datenbanksparte besser aufgehoben ;-)

sakura 1. Jul 2004 09:31

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Zitat:

Zitat von Sharky
P.S.: Ich denke Sakura meinte das die Tags nicht [ source] [ /source] heissen sondern [ delphi] [ /delphi] (Natürlich ohne die Leerzeichen)

Korrekt ;)

...:cat:...

sakura 1. Jul 2004 09:36

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Nun aber mal zu Sharkys Ansatz. Wenn die Datumspanne mal etwas größer wird, dann ist dieser wohl falsch ;-)

Ein Beispiel:
Code:
Alle Daten zw. dem 20.06.2003 und 27.08.2003
Wir sind uns einig, daß sowohl der 25.07.2003 und der 04.08.2003 dazwischen liegen.

Nach Sharky wäre aber:

Der [i]25.07.2003[/i]
2003 <= 2003 <= 2003   - TRUE
  06 <=  07 <=  08   - TRUE
  20 <=  25 <=  27   - TRUE
Datum ist korrekt überpüft

Der [i]04.08.2003[/i]
2003 <= 2003 <= 2003   - TRUE
  06 <=  08 <=  08   - TRUE
  20 <=  04 <=  27   - [b]FALSE[/b]
Damit würde das zweite Datum durchfallen obwohl dieses korrekt ist.
Kann sein, daß ich mich irre, SQL ist nicht mein Ding, aber wenn nicht :mrgreen:

...:cat:...

Sharky 1. Jul 2004 09:45

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Zitat:

Zitat von sakura
Nun aber mal zu Sharkys Ansatz. Wenn die Datumspanne mal etwas größer wird, dann ist dieser wohl falsch ...

Skandal! Ich mache doch nichts falsch ;-)
Es ist die richtige Antwort auf die Frage :!:
Das Problem ist das wohl die Frage nicht so gestellt ist wie das gewünschte Ergbniss sein sollte :stupid:

Kruemel2oo2 1. Jul 2004 09:45

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
em sharky also das mit den Params versteh ich net und zu dem denke ich auch net das dat funzt da ich ja wie man bei mir sieht Tag Monat und jahr aus ner variablen kommen (von DatTimePicker ausgelesen).

also hier mal so alles zumindestens die funktion.

Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
var
  Name1,Name, tmj: string;
  Monat, Tag1, jahr: string;
  Monat1, Tag2, jahr1: string;
  datum : TDateTime;
begin
  if RadioButton2.Checked then
  begin
    DateTimePicker2.Enabled := true;
    datum:=DateTimePicker1.Date;
    Name := ComboBox1.Text;
    tmj:=DateToStr(datum);
    //gibt den Tag zurück
    Tag1 :=copy(DateToStr(DateTimePicker1.Date), 1, 2);
    //gibt den Monat zurück
    monat:=copy(DateToStr(DateTimePicker1.Date), 4, 2);
    //gibt das Jahr zurück
    jahr:=copy(DateToStr(DateTimePicker1.Date), 9, 2);
    Tag2 :=copy(DateToStr(DateTimePicker2.Date), 1, 2);
    monat1:=copy(DateToStr(DateTimePicker2.Date), 4, 2);
    jahr1:=copy(DateToStr(DateTimePicker2.Date), 9, 2);
    if Name = 'alle' then
    begin
      Form1.Query1.Active:=False;
      Form1.Query1.SQL.Clear();
      Form1.Query1.SQL.Add('select * from Booking where (Tag between"'+Tag1+'"AND "'+Tag2+'")AND(Monat between"'+Monat+'"AND"'+Monat1+'") AND (Jahr between"'+Jahr+'"AND"'+jahr1+'") order by name, Uhrzeit');
      Form1.Query1.Open();
      Form1.Query1.Active:=True;
      Form1.QuickRep1.Preview();
    end;
  end;
end;
also das ist alles und funzen tut das auch aba nur ohne dem bereich also between.

PS: sakura die Katze ist goil :D

Sharky 1. Jul 2004 09:46

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Hai Kruemel2002,

zwei Fragen:

a) Welche Datenbank
b) Was genau möchtest Du machen? So wie Sakura geschrieben alle Datensätze die zwichen zwei Datumswerten liegen?

Kruemel2oo2 1. Jul 2004 09:53

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Mysql

ich habe 2 Datetimepicker bei denen wähle ich aus in welchen Bereich ich einen Log (den ich bei ner anderen Funktion in die DAtenbank schreibe). Ich übergebe das an einen Quickrep. Dort will ich jetzt den ausgewählten bereich (den bei den beiden DateTimepicker) sehen.

Ist das so einigermasen verständlich?ß

ich drück mich imma so schwer aus ;D

sakura 1. Jul 2004 10:03

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Zitat:

Zitat von Sharky
So wie Sakura geschrieben alle Datensätze die zwichen zwei Datumswerten liegen?

So steht es ja auch in seiner Frage (ganz, ganz oben). Das Datum war ja nur ein Beispiel für einen Bereich, nicht der Bereich ;)

...:cat:...

Kruemel2oo2 1. Jul 2004 10:28

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
also die anweisung funzt ist mir grad aufgefellen aba nur wenn ich als ertes also die erste Comobox mit den heutigen Datum nehm wenn ich ein datum nehm was gestern oda so war funzt es net :(. Woran liegt das?

edit: hab den fehler gefunden :D. ist aba nen scheiß fehler :(

Sharky 1. Jul 2004 12:06

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Zitat:

Zitat von Kruemel2oo2
....edit: hab den fehler gefunden :D. ist aba nen scheiß fehler :(

Hai Kruemel2002,

ich glaube ich habe jetzt die "optimal" Lösung gefunden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Query1 do
  begin
    Close;
    SQL.Text := 'SELECT *' + #10
      + 'FROM Booking' + #10
      + 'WHERE CAST(CONCAT(jahr,"-",monat,"-",tag) AS DATE) BETWEEN :start AND :ende' +#10
      + 'ORDER BY name, uhrzeit';
    ParamCheck := True;
    Params.ParamByName('start').AsString := FormatDateTime ('yyyy-m-d',DateTimePicker1.Date);
    Params.ParamByName('ende').AsString := FormatDateTime ('yyyy-m-d',DateTimePicker2.Date);
    Open;
  end;
end;
Mit CONCAT setze ich aus deinen drei Feldern einen String zusammen im Format 'yyyy-m-d'. Diesen wandele ich dann mit CAST in einen Datumwert um. Der rest ist dann wieder Standard-SQL.

Kruemel2oo2 1. Jul 2004 12:19

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
hmm erklär mir ma dieses paramcheck und dieses params und naja den rest versteh ich zum teil.
die 3 felder sind das die von der Daten bank? oda sind sollen das die variablen sein? und was macht dieses +#10 ? und wenn die 3 felder von der Datenbank sind wo werden denn die variablen da eingefügt? also ist bestimmt ne gute lösung (bestimmt auch optimal) aba ich seh da net so ganz durch bin net so der SQL sezi. Könntest das ma nen bischen erklären bitte!

Sharky 1. Jul 2004 12:48

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Zitat:

Zitat von Kruemel2oo2
...die 3 felder sind das die von der Daten bank?

tag,monat,jahr sind die Feldenamen in der Tabelle.

Zitat:

.. was macht dieses +#10
#10 ist nicht anderes als ein Zeilenumbruch. Manche Datenbanken mögen es nicht wenn alle Befehle in einer Zeile stehen.

Zitat:

Könntest das ma nen bischen erklären bitte!
Also,

Parameter in einer SQL-Abfrage kannst Du dir wie "platzhalter" vorstellen.
SQL-Code:
SELECT * FROM tabelle WHERE name = :param1
param1 ist jetzt mein Parameter (Platzhalter). Diesem muss ich jetzt noch einen Wert zuweisen. Das passiert mit:
Delphi-Quellcode:
begin
  Query1.Params.ParamByName ('param1').AsString := 'blubb';
end;
Vorher sage ich meinem Query mit ParamCheck := True; das es die Parameter auch bitte auswerten soll.
Der Vorteil der Parameter ist das ich mich nicht darum kümmern muss das sie in der für meine Datenbank richtigen Formatierung benutzt werden. Wenn Du das ganze ohne Parameter machen möchtest, musst Du es ja so schreiben:
Delphi-Quellcode:
begin
  Query1.Close;
  Query1.SQL.Text := 'SELECT * FROM tabelle WHERE name = ' + QuotedStr ('blubb');
  Query1.Open;
end;
Sprich: Bei einem Stringvergleich möchte die Datenbank das der String in Hochkommas steht. Ein noch besseres Beispiel sind Datumsabfragen:

Delphi-Quellcode:
begin
  Query1.Close;
  Query1.SQL.Text := 'SELECT * FROM tabelle WHERE datum = ' + DateToStr (now);
  Query1.Open;
end;
Wenn Du das so machst bekommst Du aller Warscheinlichkeit einen Fehler ;-)
Auf den meisten Rechnern ist noch die alte Datumsanzeige eingestellt. (TT.MM.JJJJ = 01.07.2004) Der mySQL-Server möchte das Datum aber in diesem Format: "JJJJ-MM-TT = 2004-07-01". Jetzt hast Du natürlich die Möglichkeit das Datum immer entsprechend zu Formatieren.

Delphi-Quellcode:
begin
  Query1.Close;
  Query1.SQL.Text := 'SELECT * FROM tabelle WHERE datum = ' + FormatDateTime ('yyyy-mm-dd',now);
  Query1.Open;
end;
Bei der Verwendung von Parametern musst Du dich darum nicht kümmern.
Delphi-Quellcode:
begin
  Query1.Close;
  Query1.SQL.Text := 'SELECT * FROM tabelle WHERE datum = :mydatum';
  Query1.ParamCheck := True;
  Query1.Params.ParamByName('myDatum').AsDate := now;
  Query1.Open;
end;
Soviel zu den Parameter.

Kruemel2oo2 1. Jul 2004 13:54

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
hmm alles klar nun bin ich wieda nen bischen schlauer :D aba ein ist mir noch net klar wo geb ich jetzt meine variablen an? also die eingelesenen damit er die von den übernimmt? die muss ich ja denn auch zu diesen Datumswert machen damit er das richtig erfasst. Aba wo soll das hin ?

Kruemel2oo2 2. Jul 2004 07:47

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
?? könntest mir das bitte sagen.

:hi:

Sharky 2. Jul 2004 07:54

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Von welchen "Variablen" sprichst Du denn? Ich muss gestehen das ich aus deinem "Satz" nicht ganz schlau werde :stupid:

Kruemel2oo2 2. Jul 2004 08:06

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Naja den Variablen die ich von den beiden DateTimepickern nehme. Hatte doch gesagt 2 DateTimepicker wo ich je Tag Monat Und Jahr auslese. Naja und die sollen nachern den Bereich angeben. Die muss ich ja denn auch zusammen fassen zu diesen Date. Aba ich weiß nicht ganz wo ich die in den angegebenen Quelltext reinsetzen muss und ejrlihc gesagt auch net wie :(.

hatte doch meinen Quelltext auch hier geposted also mein select befehl dasieht man die gemeinten Variablen :D

Sharky 2. Jul 2004 08:13

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Hai Kruemel2002,

überlege doch einmal ;-)

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Query1 do
  begin
    Close;
    SQL.Text := 'SELECT *' + #10 
      + 'FROM Booking' + #10 
      + 'WHERE CAST(CONCAT(jahr,"-",monat,"-",tag) AS DATE) BETWEEN :start AND :ende' +#10 
      + 'ORDER BY name, uhrzeit';
    ParamCheck := True;
    Params.ParamByName('start').AsString := FormatDateTime ('yyyy-m-d',[color=red]DateTimePicker1.Date[/color]);
    Params.ParamByName('ende').AsString := FormatDateTime ('yyyy-m-d',[color=red]DateTimePicker2.Date[/color]);
    Open;
  end;
end;
Jetzt siehst Du genau wo ich das Datum aus den beiden DateTimePickern übergebe. Wenn Du das Datum vorher in eine Variable speicherst muss halt diese übergeben werden.

Kruemel2oo2 2. Jul 2004 08:16

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
ups

bin manchmal nen biscen schwervon begriff :D fetten dank ich werds mal ausprobieren :D

Kruemel2oo2 2. Jul 2004 08:21

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
-.- bin dumm

Kruemel2oo2 2. Jul 2004 08:29

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
hmm also wenn ich das ausführe stürtz mein prog ab er mein "Merkmal nicht verfügbar"

Robert_G 2. Jul 2004 09:14

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Zitat:

Zitat von Sharky
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Query1 do
  begin
    Close;
    SQL.Text := 'SELECT *' + #10 
      + 'FROM Booking' + #10 
      + 'WHERE CAST(CONCAT(jahr,"-",monat,"-",tag) AS DATE) BETWEEN :start AND :ende' +#10 
      + 'ORDER BY name, uhrzeit';
    ParamCheck := True;
    Params.ParamByName('start').AsString := FormatDateTime ('yyyy-m-d',[color=red]DateTimePicker1.Date[/color]);
    Params.ParamByName('ende').AsString := FormatDateTime ('yyyy-m-d',[color=red]DateTimePicker2.Date[/color]);
    Open;
  end;
end;

:gruebel:
Was machst du denn da?
  • Den #34 wird mySQL (wie die meisten DBs) als Start/Ende eines Identifiers ansehen, NICHT als String. (Das könnte das "Merkmal" sein ;) )
  • Warum erst ein Typcast auf Date, wenn du ihm die Werte als String gibst :shock: :?:

So dürfte ein Schuh draus werden: ;)
Delphi-Quellcode:
with Query do
begin
  SQL.Text :=
    'SELECT *' + #10 +
    'FROM  Booking' + #10 +
    'WHERE CAST(CONCAT(jahr' + #10 +
    '                 ,''-''' + #10 +
    '                 ,monat' + #10 +
    '                 ,''-''' + #10 +
    '                 ,tag) As Date) BETWEEN :i_Start AND :i_Ende' + #10 +
    'ORDER BY Name' + #10 +
    '        ,Uhrzeit';
  // Parse Statement um Variablen zu erkennen
  ParamCheck := True;
  // Parameterzuweisung
  with Params do
  begin
  // Die Zuweisung des DataType soll verhindern, dass die MidWare irgendwelchen Käse fabriziert
    ParamByName('i_Start').DataType := ftDate;
    ParamByName('i_Start').Value   := DateTimePicker1.Date;
    ParamByName('i_Ende').DataType := ftDate;
    ParamByName('i_Ende').Value    := DateTimePicker2.Date;
  end;
  // Ausführen
  Open;
end;

Sharky 2. Jul 2004 09:20

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Zitat:

Zitat von Robert_G
...
  • Den #34 wird mySQL (wie die meisten DBs) als Start/Ende eines Identifiers ansehen, NICHT als String. (Das könnte das "Merkmal" sein ;) )
  • Warum erst ein Typcast auf Date, wenn du ihm die Werte als String gibst :shock: :?:
....

Hai Robert,
darauf habe ich gewartet ;-)
Warum ich es als String übergeben? Weil es als .AsDate nicht funktionierte. Ich vermute das in diesem Fall das Datum im "falschen Format" ankommt. Da die Zahlen in den einzelnen Felder ja 1/2/3 und nicht 01/02/03 sind wird (so vermute ich) bei dem Typcasting das Datum intern auch so verwendet z.B. 2004-5-1 und nicht 2004-05-01.

Mit dem Start/Ende könntest Du recht haben. Obwohl es bei mir hier ohne Probleme funktionirt.

Kruemel2oo2 2. Jul 2004 09:22

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Auch hier stürzt das prog ab und gibt die Fehlermeldung "Merkmal nicht verfügbar".

Sharky 2. Jul 2004 09:27

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Zitat:

Zitat von Kruemel2oo2
Auch hier stürzt das prog ab und gibt die Fehlermeldung "Merkmal nicht verfügbar".

Hmmm.... welche Version des mySQL-Servers hast Du denn?

Kruemel2oo2 2. Jul 2004 09:36

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
so ich habe grade erfahren das es gar kein Mysql ist! Mir wurde falsche infos gegeben sry es ist dBase könnte es daran liegen das dieser fehler kommt? (Ich schreib das prog auch nur weiter und mir wurde anfangs gesagt das das MySQL ist sorry)

Edit: Mir wurde gesagt das DBase nicht alle SQL befehle kann.

Sharky 2. Jul 2004 09:55

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
:shock:
Als Programmierer sollte man schon wissen auf welche Datenbank man zugreifft. Tja, wenn es dBase ist wird es wohl nicht gehen.

Kruemel2oo2 2. Jul 2004 10:03

Re: SQL Befehl zum Ausgeben von daten in einen bestimmten Be
 
Ja klar müsste man es wissen ist mir auch nen bischen peinlich -.-. Aba bin halt noch noch net gut bin im ersten Lehrjahr und da kann mir das doch mal passieren oder nicht?

Zitat:

Tja, wenn es dBase ist wird es wohl nicht gehen.
Gibs da nicht auch ne möglichkeit? Oder steh ich jetzt wieda am anfang? :(

Wenns dafür nix gibt denn bedank ich mich füür die Hilfe voon euch alle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz