Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SELECT BETWEEN funktioniert nur in einem geringen Zeitraum? (https://www.delphipraxis.net/60742-select-between-funktioniert-nur-einem-geringen-zeitraum.html)

CG2003 11. Jan 2006 20:27

Datenbank: MySQL • Version: 4.1 • Zugriff über: ZeoDBO 6.51 Alpha CVS Build

SELECT BETWEEN funktioniert nur in einem geringen Zeitraum?
 
Hallo,

ich habe (leider) mal wieder ein Datenbankproblem :oops:, und hoffe hier mal wieder auf Eure kompetente Hilfe.

Also, ich habe mittels Zeos Query folgende Abfrage:

Delphi-Quellcode:
  DataModule1.PartsVerbrauchQuery.SQL.Add('SELECT PartNr, COUNT(*) FROM Buchungen WHERE PartDatum BETWEEN ''' + Startdatum + ''' AND ''' + EndDatum + ''' AND PartStatus = ''Abbuchung''');
Wobei "Startdatum" und "Enddatum", Werte aus einem TDatePicker sind, die mittels
Delphi-Quellcode:
DateToStr
konvertiert wurden.
Alle Tabellenfelder sind vom Typ varchar. Ich denke, das kann man leider nicht mehr ändern.

Mein Problem ist nun, das ich maximal nur einen Zeitraum von ca. 2 Wochen einstellen kann., damit ich was angezeigt bekomme.
Wenn ich zum Beispiel drei Wochen nehme, kriege ich leider gar nichts mehr angezeigt.

Woran kann das liegen? Und vor allem, wie kann ich das ändern?


Vielen Dank schon mal im Voraus!

marabu 11. Jan 2006 20:34

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
Hallo Sebastian,

auch wenn PARTDATUM bei dir vom Typ VARCHAR ist, so solltest du es wenigstens als Datum behandeln - Stichwort CAST.

Grüße vom marabu

Sharky 11. Jan 2006 20:35

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
Hai CG2003,

Du möchtest ein BETWEEN auf ein Char Feld anwenden? Ich habe das jetzt in deinem Fall nicht versucht. Aber das macht ja sicher Probleme. Wie soll denn ein SQL-Server ein Datum erkennen wenn es als "String" vorliegt.

Mein dringender Rat. Passe die Feldtypen so an wie sie auch sein sollen und arbeite dann nicht mehr mit diesen "Zusammengesetzten SQL-Befehlen" sonder mit Parametern in dein Querys.

Edit: Und schon wieder hat mir Marabu dazwichen geposten :cry:

marabu 11. Jan 2006 20:39

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
Hai Sharky,

Zitat:

Zitat von Sharky
Edit: Und schon wieder hat mir Marabu dazwichen geposten :cry:

take it easy - ich muss fast die Hälfte meiner Beiträge wegwerfen, weil ich zu langsam schreibe. So ist das Leben eben.

Freundliche Grüße vom marabu

mkinzler 11. Jan 2006 20:51

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
Ich kann mich meinen Vorrednern nur anschließen. Stringwerte werden anders sortiert als Datumswete. Waährend der Datumswert "01.02" größer ist als der Datumswert "30.01" ist es bei Stringwerten gerade andersherum., da 30 > 01 ist.
Die Verwendung von Parametern bietet sich auch aus Geschwindigkeitsgründen an, wenn der Query öfters verwendet wird.

Delphi-Quellcode:
DataModule1.PartsVerbrauchQuery.SQL.Add('SELECT PartNr, COUNT(*) FROM Buchungen WHERE PartDatum BETWEEN :vonDatum and :endDatum AND PartStatus = ''Abbuchung''');
...
DataModule1.PartsVerbrauchQuery.ParamByName('vonDatum').asString = StartDatum;
DataModule1.PartsVerbrauchQuery.ParamByName('endDatum').asString = EndDatum;
..

CG2003 11. Jan 2006 20:56

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
Aha. Das war mir nicht bekannt.

Aber was hat es mit den PCHar-Typen und diesem ominösen CAST auf sich. (Sorry, aber von "CAST" höre ich heute das erste Mal).

Wie ist das zu verwenden?
Muss ich meine ganze Datenbank umkrempeln? Wäre äusserst unpraktisch jetzt...

mkinzler 11. Jan 2006 21:11

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
Zitat:

Zitat von CG2003
Aha. Das war mir nicht bekannt.

Aber was hat es mit den PCHar-Typen und diesem ominösen CAST auf sich. (Sorry, aber von "CAST" höre ich heute das erste Mal).

Wie ist das zu verwenden?
Muss ich meine ganze Datenbank umkrempeln? Wäre äusserst unpraktisch jetzt...

Ich habe mir deinen Query einmal genauer angeschaut, was willst du mit ihm bezwecken
SQL-Code:
SELECT PartNr, COUNT(*) FROM Buchungen WHERE PartDatum BETWEEN :vonDatum and :endDatum AND PartStatus = 'Abbuchung';
Die Abfrage ist m.E. fehlerhaft, da count eine aggregatfunktion ist. d.H in diesem Fall werden alle Datensätze zusammengefasst. Nicht aggregierte Felder( in deinem Fall PartNr) müssen bei allen datensätzen gleich sein, was man durch ein GROUP BY errreicht also:
SQL-Code:
SELECT PartNr, COUNT(*) FROM Buchungen WHERE PartDatum BETWEEN :vonDatum and :endDatum AND PartStatus = 'Abbuchung' group by PartNr;
Wieviele Datensätze sind in deiner Datenbank?
Ich würde Feldtypen nach den wirklichen Typen der Daten auswählen. D.h Datumsfelder als Date, Zahlen als integer oder numeric usw.

BTW du kannst die Daten ja auslagern, die Felder anpassen und die Dtaen wieder importiern.

CG2003 11. Jan 2006 21:54

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
In meiner Tabelle "Buchungen" sind die Daten so gespeichert:

PartNr - Datum - Status - Alter Bestand - Neuer Bestand

Beispiel: 10155643 - 02.01.2006 - Abbuchung - 45 - 44


Ich will nun für jede PartNr. die Abbuchungen in einem Zeitraum zusammenfassen/zusammenzählen. Also z.B.:

10155643 - 8

mkinzler 12. Jan 2006 09:02

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
Dann stimmet deine Abfrage nicht, da count die Anzahl der Datensätze zählt. Wie erwähnt fehlt auch das group by.
Ich würde die Felder NeuerNestand und alterBestand löschen und nur ein Feld stueckzahl erzeugen und dann die Abfrage wie folgt ändern.
SQL-Code:
SELECT PartNr, Sum( stueckzahl) FROM Buchungen WHERE Datum BETWEEN :vonDatum and :endDatum AND PartStatus = 'Abbuchung' group by PartNr;

Sharky 12. Jan 2006 09:24

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
 
Zitat:

Zitat von CG2003
.... Beispiel: 10155643 - 02.01.2006 - Abbuchung - 45 - 44

Hai CG2003,
noch eine Anmerkung zu deinen Datums-STRINGS.
Wenn Du in deiner Anwendung das Datum aus den Eingabefeldern mit Delphi-Referenz durchsuchenDateToStr() konvertiertst wirst Du mal ein Problem bekommen wenn ein Anwender ein anderes Datumsformat auf seinem Rechner eingestellt hat.

Daum noch einmal der Hinweiss: Verwende für die Datumsfelder einen Datumstyp und für die Zahlenfelder einen Zahlentyp in der Tabelle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Seite 1 von 2  1 2      

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