![]() |
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:
Wobei "Startdatum" und "Enddatum", Werte aus einem TDatePicker sind, die mittels
DataModule1.PartsVerbrauchQuery.SQL.Add('SELECT PartNr, COUNT(*) FROM Buchungen WHERE PartDatum BETWEEN ''' + Startdatum + ''' AND ''' + EndDatum + ''' AND PartStatus = ''Abbuchung''');
Delphi-Quellcode:
konvertiert wurden.
DateToStr
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! |
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 |
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: |
Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
Hai Sharky,
Zitat:
Freundliche Grüße vom marabu |
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; .. |
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... |
Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
Zitat:
SQL-Code:
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:
SELECT PartNr, COUNT(*) FROM Buchungen WHERE PartDatum BETWEEN :vonDatum and :endDatum AND PartStatus = 'Abbuchung';
SQL-Code:
Wieviele Datensätze sind in deiner Datenbank?
SELECT PartNr, COUNT(*) FROM Buchungen WHERE PartDatum BETWEEN :vonDatum and :endDatum AND PartStatus = 'Abbuchung' group by PartNr;
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. |
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 |
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;
|
Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra
Zitat:
noch eine Anmerkung zu deinen Datums-STRINGS. Wenn Du in deiner Anwendung das Datum aus den Eingabefeldern mit ![]() 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 14:30 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