AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SELECT BETWEEN funktioniert nur in einem geringen Zeitraum?
Thema durchsuchen
Ansicht
Themen-Optionen

SELECT BETWEEN funktioniert nur in einem geringen Zeitraum?

Ein Thema von CG2003 · begonnen am 11. Jan 2006 · letzter Beitrag vom 12. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#1

SELECT BETWEEN funktioniert nur in einem geringen Zeitraum?

  Alt 11. Jan 2006, 20:27
Datenbank: MySQL • Version: 4.1 • Zugriff über: ZeoDBO 6.51 Alpha CVS Build
Hallo,

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

Also, ich habe mittels Zeos Query folgende Abfrage:

  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 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!
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 11. Jan 2006, 20:34
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 11. Jan 2006, 20:35
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
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 11. Jan 2006, 20:39
Hai Sharky,

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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 11. Jan 2006, 20:51
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;
..
Markus Kinzler
  Mit Zitat antworten Zitat
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#6

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 11. Jan 2006, 20:56
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...
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 11. Jan 2006, 21:11
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
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:
SELECT PartNr, COUNT(*) FROM Buchungen WHERE PartDatum BETWEEN :vonDatum and :endDatum AND PartStatus = 'Abbuchunggroup 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.
Markus Kinzler
  Mit Zitat antworten Zitat
CG2003

Registriert seit: 8. Nov 2003
Ort: Hamburg
470 Beiträge
 
Delphi 2009 Professional
 
#8

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 11. Jan 2006, 21:54
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
Sebastian M.
Viele Grüße aus Hamburg


Meine Website: www.sebastian-mundt.com
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 12. Jan 2006, 09:02
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.
SELECT PartNr, Sum( stueckzahl) FROM Buchungen WHERE Datum BETWEEN :vonDatum and :endDatum AND PartStatus = 'Abbuchunggroup by PartNr;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#10

Re: SELECT BETWEEN funktioniert nur in einem geringen Zeitra

  Alt 12. Jan 2006, 09:24
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:02 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