German Hilfe bei SQL-statement

peternmb

Well-Known Member
Licensed User
Longtime User
Hallo,

ich bräuchte Hilfe bei der Formulierungt eines SQL-Statements.
In meiner Datenbank ist ein Datumsfeld als Text (erfasst) und als Integer (erfasstN) vorhanden.
Ich möchte die Datensätze von einem bestimmten Jahr chronologisch anzeigen.

so funktioniert es nicht:
B4X:
statement="SELECT * FROM table1 WHERE year(erfasstN)=2010 ORDER BY erfasstN"
 

rboeck

Well-Known Member
Licensed User
Longtime User
Damit ich das Jahr aus erfasst auslesen kann, habe ich es auf diese Weise gelöst:

Select strftime('%Y',[erfasst]) AS Jahr

Die Schreibwese des Datums ist in diesem Fall yyyy-mm-dd.
 

peternmb

Well-Known Member
Licensed User
Longtime User
Danke,
da das Datum auch als String vorliegt habe ich es jetzt mit der substr-Funktion gelöst:
B4X:
statement="SELECT * FROM table1 WHERE substr(erfasst,7,4)=2010 ORDER BY erfasstN"
 

pucki

Active Member
Licensed User
Longtime User
Funktioniert nur wenn das Datum wirklich ein String ist in der Deklaration.

Ich mache das so unter VB per SQL wenn ich ein Datum abfrage, wenn das Feld als DATE deklariert ist.

B4X:
 akt_datum = Date.Today <- setzt das aktuelle datum

    such_datum = "#" + akt_datum.Month.ToString + "/" + akt_datum.Day.ToString + "/" + akt_datum.Year.ToString + "#"
    sql = "SELECT * FROM Sendungen where Beginn >= " + such_datum

Der Code ist ein VB Code um dir zu zeigen wie der String für die Suchanfrage zusammengesetzt wird.


Wenn das Feld INTEGER ist, also eine meterlange Zahl, habe ich die große Vermutung das es sich um eine UNIX-Time handelt. Dann brauchst du eine Umrechnungsroutine die dein Datum in eine (genauer gesagt 2 Zahlen) umwandelt und musst eine Bereichs-Abfrage machen. Nähere siehe https://de.wikipedia.org/wiki/Unixzeit oder frage Google.

Gruß

Pucki
 
Last edited:

peternmb

Well-Known Member
Licensed User
Longtime User
Hallo Pucki,

vielen Dank für deine Hinweise.

ich habe mir die Datenbank mit einem SQL-Browser angesehen. In dem das Int-Feld wird das Datum einfach 8-stellig (JJJMMDD) gespeichert, eignet sich so wunderbar zum Sortieren. Da ich nur das Jahr als Kriterium benötige eignet sich das String-Feld dagegen prima zum Suchen, zumal der Jahreswert per Spracheingabe geliefert wird...

Für was steht das # vor und nach dem such_datum? Muss das bei dem SQL-Statement dabei sein oder nur bei deinem VB-Code?
 

rboeck

Well-Known Member
Licensed User
Longtime User
Das # Zeichen dient hier als Abgrenzung von Datumsfeldern z. B. in Abfragen, wo z. B. bei Textfelder die Anführungszeichen stehen würden.
 

pucki

Active Member
Licensed User
Longtime User
Zuerst einmal SQL ist noch lange nicht SQL.

Jede Engine hat ihre eigenen Feinheiten. Ich habe mir mal auf den Flohmarkt für 5 Euro ein Buch gekauft was die Feinen Unterschiede zwischen 4 Versionen erklärt.
https://www.amazon.de/SQL-GE-PACKT-Meinhardt-Schmidt/dp/3826606868 Das ist kein Buch "wie lerne ich SQL" es ist ein Nachschlagewerk. Wie ist der Befehl und wie schreibe ich ihn richtig. Also für jemanden der weiß was er will nur nicht wie er der Befehl / Die Funktion geht. Ich liebe das Buch ;)

Was die # angeht. Die will MircoSoft-SQL haben beim Datumsfeld. Da aber ein Datumsfeld eigentlich in meinen Augen eine Standart-Sache ist, denke ich das die Abfrage auch normal funktioniert. Mein Hinweis auf VB sollte dir nur mitteilen, das du den Code lesen kannst, aber NICHT 1:1 in dein Projekt kopieren kannst ;) Davon abgesehen dokumentiert der Code sich selbst und ich muss keine Mega-Erklärung schreiben " Was was ist "

rauskommen tut dann für den 31.jan.2018 folgendes

B4X:
select * from Sendungen where datum = #01/31/2018#

Der Code selbst stammt aus einer meiner Abfragen einer MS-Access-Datenbank.

Es gibt aufgrund von Ländereigenheiten bei Datumsfeldern immer Stress. Datenbanken die oft konvertiert werden haben meist wenn der Coder schlau ist, das Datumsfeld 2 x drinstehen. Einmal als Datumsfeld codiert und einmal als Text o. normal-Integer. Beide male wird das Datum dann DEUTSCH-FALSCHRUM geschrieben. z.b. 20180131 bzw. als Text 2018.01.31 . Der Grund ist das man so problemlos sortieren und VON-BIS Abfragen machen kann.

Kleiner Kommentar am Rande. Das Problem mit der Codierung hast du bei Text-Feldern. Da hilft es dann die Code-Tabelle zu wissen. ;)


Gruß

Pucki
 

peternmb

Well-Known Member
Licensed User
Longtime User
Vielen Dank für die ausführlichen Hiweise und den Buchtipp.

Jetzt ist mir auch klar, warum ich die Datumsfelder 2X in der Datenbank habe ;)

Meine Datenbank wird über CSV aus einer Windows-(DBASE)-Datei generiert.
Ich habe den Tipp bekommen, die Datumsfelder dabei doppelt anzulegen - allerdings wusste ich vorher dafür keinen konkreten Grund.

Für das Anzeigen nutze ich das Textfeld, zum Sortieren den Int-Wert - funktioniert prima so, ohne irgendwelche Konvertierungen.
 
Top