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

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.