Seite 1 von 1

SQL suche Datum < als

Verfasst: 23.08.2013 17:18
von gnaps
Hallo Forum,

ich hab mal wieder ein kleines Problem

Hier der Code

Code: Alles auswählen

Procedure DatensatzFaellig()
  SuchenFaellig.s="22.08.2001"
  Protected Query.s="SELECT * FROM Datenbank where datumantragbank like '" + SuchenFaellig.s + "'"
  
  ClearGadgetItems(#gad_ListAnschrift) ;lösche das ListenGadget
  
  If DatabaseQuery(#Datenbank, Query.s) ;Prüfe ob die Tabelle in der Datenbank da ist und sortiere die Einträge nach "datum"
    While NextDatabaseRow(#Datenbank) ;Schleife für das Einlesen der vorhandenen Datensätze
     Debug "OK"
      For i = 1 To tabellenanzahl.i ;Schleife für die Spalten 29 für die Spaltenanzahl
        itemtext + #LF$ + GetDatabaseString(#Datenbank, i) ;Übergebe die Daten aus der Datenbank an dei Variable
       Next  
      AddGadgetItem(#gad_ListAnschrift, -1, itemtext) ;Die Daten an das ListenGadget übergeben
    Wend
    FinishDatabaseQuery(#Datenbank); SQL-Abfrage beenden Diese Funktion ist immer nach einem Query auszuführen!
  Else
    MessageRequester(DialogDatenbankfehlerTitel.s, DialogDatenbankfehler.s+DatabaseError(),#MB_ICONERROR)
  EndIf
EndProcedure
die Suche mit diesem Code funktioniert.
Wenn ich jetzt aber < (kleiner als) suchen will bekomme ich einen Fehler.

Meine SQL-Anweidung

Code: Alles auswählen

SELECT * FROM Datenbank where datumantragbank like < '" + SuchenFaellig.s + "'"
was ist da falsch oder wie lautet die Anweisung richtig ?

Danke im voraus

Re: SQL suche Datum < als

Verfasst: 23.08.2013 17:28
von Pelagio
Hallo gnaps,

versuch es mal wie folgt:

Code: Alles auswählen

SELECT * FROM Datenbank where datumantragbank <'" + SuchenFaellig.s + "'"
Ich meine nicht ganz so falsch zu liegen.
(Kiffi du bist einfach zu schnell als das man seine Fehler noch RECHTZEITIG ändern kann)

Re: SQL suche Datum < als

Verfasst: 23.08.2013 17:33
von Kiffi
ohne genau geguckt zu haben eher so:

Code: Alles auswählen

SELECT * FROM Datenbank where datumantragbank < '" + SuchenFaellig.s + "'"
Grüße ... Kiffi

Re: SQL suche Datum < als

Verfasst: 23.08.2013 19:26
von gnaps
Hallo Leute,

zuerst einmal danke für die schnelle Antwort.

Leider gehts noch nicht so richtig.

mit der Anweisung

Code: Alles auswählen

SELECT * FROM Datenbank where datumantragbank < '" + SuchenFaellig.s + "'"
findet er den Datensatz in dem das Datum kleiner SuchenFaellig.s ist.
Jedoch läuft die while - wend Schleife vier mal durch.
und zeigt mir einen Datensatz mit dem Datum 22.08.2001 vier mal an.

Code: Alles auswählen

While NextDatabaseRow(#Datenbank) ;Schleife für das Einlesen der vorhandenen Datensätze
     Debug "OK"
      For i = 1 To tabellenanzahl.i ;Schleife für die Spalten 29 für die Spaltenanzahl
        itemtext + #LF$ + GetDatabaseString(#Datenbank, i) ;Übergebe die Daten aus der Datenbank an dei Variable
       Next 
      AddGadgetItem(#gad_ListAnschrift, -1, itemtext) ;Die Daten an das ListenGadget übergeben
    Wend
ich habe vier Datensätze in der Datenbank
diese haben in der Spalte datumantragbank folgende Einträge
22.08.2001
22.08.2005
22.08.2012
22.08.2013
es sollte nur der erste Datensatz gefunden werden, warum läuft die Schleife dann vier mal durch ?

Gruß
gnaps

Re: SQL suche Datum < als

Verfasst: 23.08.2013 21:23
von Pelagio
Hallo gnaps,

also bei mir funktioniert die Datumsabfrage mit dem folgenden Code:

Code: Alles auswählen

;SQLite
;Datenbank: PB_SQLiteTest.sqlite
;Tabelle:   DatumTab
;Spalten:   Datum  -  Date

UseSQLiteDatabase()

#DBID = 99
#DBFile = "PB_SQLiteTest.sqlite"

Define.s sqlQuery

; Eine eventuell vorhandene sqlite Datenbank wird gelöscht
If (FileSize(#DBFile)>#PB_Any): DeleteFile(#DBFile): EndIf

; Erstellen einer Datei für die Datenbank
CreateFile(#DBID, #DBFILE): CloseFile(#DBID)

; Erstellen und füllen der Datenbank
If OpenDatabase(#DBID, #DBFile, #NULL$, #NULL$)
   sqlQuery = "CREATE TABLE [DatumTab] (Datum Date);"
   DatabaseUpdate(#DBID, sqlQuery)
   sqlQuery = "INSERT INTO [DatumTab] Values ('22.08.2001');"
   DatabaseUpdate(#DBID, sqlQuery)
   sqlQuery = "INSERT INTO [DatumTab] Values ('22.08.2005');"
   DatabaseUpdate(#DBID, sqlQuery)
   sqlQuery = "INSERT INTO [DatumTab] Values ('22.08.2012');"
   DatabaseUpdate(#DBID, sqlQuery)
   sqlQuery = "INSERT INTO [DatumTab] Values ('22.08.2013');"
   DatabaseUpdate(#DBID, sqlQuery)
   CloseDatabase(#DBID)
EndIf

; Datenbankabfrage
If OpenDatabase(#DBID, #DBFile, #NULL$, #NULL$)
   sqlQuery = "Select * FROM DatumTab WHERE Datum < '22.08.2005';"
   If DatabaseQuery(#DBID, sqlQuery)
      While NextDatabaseRow(#DBID) ;Schleife für das Einlesen der vorhandenen Datensätze
         Debug GetDatabaseString(#DBID, 0)
      Wend
   EndIf
   CloseDatabase(#DBID)
EndIf

End

Re: SQL suche Datum < als

Verfasst: 23.08.2013 22:30
von Kiffi
Pelagio hat geschrieben:also bei mir funktioniert die Datumsabfrage mit dem folgenden Code: [...]
reiner Zufall ;-)

Code: Alles auswählen

UseSQLiteDatabase()

#DBID = 99

OpenDatabase(#DBID, ":memory:", "", "")
DatabaseUpdate(#DBID, "CREATE TABLE [DatumTab] (Datum Date);")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('22.08.2001');")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('22.08.2002');")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('22.08.2003');")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('01.12.2004');")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('01.12.2005');")

If DatabaseQuery(#DBID, "Select * FROM DatumTab WHERE Datum > '22.08.2003';")
	While NextDatabaseRow(#DBID)
		Debug GetDatabaseString(#DBID, 0)
	Wend
EndIf
... gibt nicht die Jahre 2004 und 2005 aus.

Entweder man speichert die Datumswerte als Zahlen ab oder man
schnibbelt die Datumsstrings im Query mit substr() auseinander.

Grüße ... Kiffi

Re: SQL suche Datum < als

Verfasst: 24.08.2013 00:15
von freak
Also wenn es sich bei der DB um SQLite handelt (ist im ersten Post nicht ersichtbar), dann kann man das schon so machen. Man muss die Datumswerte nur im ISO-Format schreiben damit die DB das versteht:

Code: Alles auswählen

UseSQLiteDatabase()

#DBID = 99

OpenDatabase(#DBID, ":memory:", "", "")
DatabaseUpdate(#DBID, "CREATE TABLE [DatumTab] (Datum Date);")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('2001-08-22');")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('2002-08-22');")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('2003-08-22');")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('2004-12-01');")
DatabaseUpdate(#DBID, "INSERT INTO [DatumTab] Values ('2005-12-01');")

If DatabaseQuery(#DBID, "Select * FROM DatumTab WHERE Datum > '2003-08-22';")
   While NextDatabaseRow(#DBID)
      Debug GetDatabaseString(#DBID, 0)
   Wend
EndIf
Die Handhabung von Datumswerten ist aber sehr unterschiedlich bei den verschiedenen DBs. Es wird also auf einer anderen DB wohl eher nicht genauso funktionieren. Unabhängig von der DB ist man wenn man per ParseDate()/FormatDate() in einen PB Datumswert umwandelt und diesen als Zahl speichert/vergleicht.

Re: SQL suche Datum < als

Verfasst: 24.08.2013 05:26
von PMV
mySQL sollte das Datumsformat yyyy-mm-dd auch verstehen. :)

MFG PMV

Re: SQL suche Datum < als

Verfasst: 24.08.2013 07:30
von Pelagio
:praise: Ihr habt Recht,

um mit dem Datum zu Arbeiten braucht man das Datumsformat 'yyyy-mm-yy',
zu meiner Entschuldigung muss ich sagen das ich grundsätzlich eine entsprechende Procedure in einer *.pbi benutze.

Code: Alles auswählen

Procedure.s GetDate(vDate.s)
      Protected pDate.s
      
      vDate = StringField(vDate, 1, " ")
      If FindString(vDate, "-")
         pDate = StringField(vDate, 3, "-") + "."
         pDate + StringField(vDate, 2, "-") + "."
         pDate + StringField(vDate, 1, "-")
      Else
         pDate = StringField(vDate, 3, ".") + "-"
         pDate + StringField(vDate, 2, ".") + "-"
         pDate + StringField(vDate, 1, ".")
      EndIf
      ProcedureReturn pDate
EndProcedure
Ich Arbeite lieber mit einem erkennbaren Datum in der Datenbank (erkennbar mit externen Browser/Manager) als mit einer Zahl.