Entwickler-Ecke
Datenbanken - Geburtstage per SQL ermitteln
Otifant - So 19.02.06 14:01
Titel: Geburtstage per SQL ermitteln
Hallo,
ich möchte aus einer Paradox Tabelle mit Adressdaten die unter anderem das Feld "Geburstag" als DateTime enthält alle Datensätze selektieren die heute/bzw. alternativ innerhalb der nächsten Woche Geburtstag haben. Und dann errechnen wie alt die Person konkret ist.
Der erste Ansatz war:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin
DecodeDate(Present, Year, Month, Day); datum_von:=inttostr(day)+'.'+inttostr(month)+'.1900'; datum_bis:=inttostr(day)+'.'+inttostr(month)+'.2100';
sql_text:=('select count(gebdatum) from adress where datum >='+#39+datum_von+#39+'and datum <='+#39+datum_bis+#39); query1.close; query1.SQL.clear; query1.SQL.add(sql_text); query1.Open; |
Das funktioniert natürlich nicht weil ich dann alle von datum_von bis datum_bis habe.
Wie kann ich nur nach dem Tag und Monat suchen und das Jahr offenlassen ??
Danke
Kersten
Moderiert von
raziel: Delphi-Tags hinzugefügt
atarigold - So 19.02.06 15:37
Versuche mal die LocalSQL Funktion EXTRACT (sollte auch mit Paradox funktionieren):
SQL-Anweisung
1: 2: 3:
| Select EXTRACT (MONTH FROM datum) AS Monat FROM Tabellenname where EXTRACT (MONTH FROM datum)=7 (für Juli) |
Für Tag entsprechend DAY verwenden.
Moderiert von
Christian S.: SQL-Tags hinzugefügt
Otifant - So 19.02.06 22:29
atarigold hat folgendes geschrieben: |
Versuche mal die LocalSQL Funktion EXTRACT (sollte auch mit Paradox funktionieren):
SQL-Anweisung 1: 2: 3:
| Select EXTRACT (MONTH FROM datum) AS Monat FROM Tabellenname where EXTRACT (MONTH FROM datum)=7 (für Juli) |
Für Tag entsprechend DAY verwenden.
Moderiert von Christian S.: SQL-Tags hinzugefügt |
Danke für den Tip -ich habe den SQL-Text ergänzt und ich bekomme wie gewünscht alle Geburstage des heutigen Tages angezeigt. Die Frage ist nur ob ich in der gleichen Abfrage auch noch gleich das Alter ausrechnen kann ?
Meine SQl-Abfrage lautet aktuell:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9:
| sql_text:=('Select name, vorname, gebdatum, EXTRACT (MONTH FROM gebdatum) AS Monat, EXTRACT (DAY FROM gebdatum) AS TAG, EXTRACT (year FROM gebdatum) AS jahr FROM adress where EXTRACT (MONTH FROM gebdatum)='+monat1+ ' and EXTRACT (DAY FROM gebdatum)='+tag1+' order by jahr');
Tag1,Monat1,Jahr1 = aktuelles Tagesdatum als String |
Danke Kersten :)
UGrohne - Mo 20.02.06 03:48
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8:
| Select name, vorname, gebdatum, EXTRACT (MONTH FROM gebdatum) AS Monat, EXTRACT (DAY FROM gebdatum) AS TAG, EXTRACT (year FROM gebdatum) AS jahr, ('+Jahr1+' - jahr) AS alter FROM adress where EXTRACT (MONTH FROM gebdatum)='+monat1+ ' and EXTRACT (DAY FROM gebdatum)='+tag1+' order by jahr; |
Hoffe, dass LocalSQL das kann ;). In diesem Fall kannst Du das so machen, weil Du nicht auf den genauen Geburtstag achten musst. Denn genau dieser wird ja für die Abfrage zugrunde gelegt. Wenn Du aber allgemein jemandes Alter ausrechnen willst, dann funktioniert das mit dieser einfachen Methode natürlich nicht mehr ;)
alzaimar - Mo 20.02.06 08:26
Das Problem bei Abfragen dieser Art ist, das die gesammte Tabelle durchsucht werden muss. Besteht die Tabelle aus Freunden, macht das nichts, weil man selten mehr als 10.000 hat, aber grundsätzlich ist so eine Query aus DB-technischer Sicht absolut verboten, weil sie eine Performancebremse ist.
Ich würde in diesem Falle der Tabelle noch eine eigene Spalte 'Geburtstag ohne Jahr' spendieren, von mir aus ein Integer, der so kodiert ist: MMDD. So wird der 24.12 auf die Zahl 1224, und z.B. der 20.2 auf 202 abgebildet. Dann lege ich einen Index auf die Spalte und kann die Geburtstage viel schneller finden. Ich kann mit dieser Codierung auch die Leute sehr schnell ausfindig machen, die z.B. zwischen dem 5.1 und 30.3 ("between 105 and 303") Geburtstag haben.
Natürlich muss man immer abwägen, ob sich das überhaupt lohnt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!