Autor Beitrag
Otifant
Hält's aus hier
Beiträge: 6

2000, XP
Delphi 5.0 Prof
BeitragVerfasst: So 19.02.06 14:01 
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:

ausblenden 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 user profile iconraziel: Delphi-Tags hinzugefügt
atarigold
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 84

WIN XP, Linux 2.4
D7, Delphi 2006 Prof
BeitragVerfasst: So 19.02.06 15:37 
Versuche mal die LocalSQL Funktion EXTRACT (sollte auch mit Paradox funktionieren):


ausblenden 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 user profile iconChristian S.: SQL-Tags hinzugefügt
Otifant Threadstarter
Hält's aus hier
Beiträge: 6

2000, XP
Delphi 5.0 Prof
BeitragVerfasst: So 19.02.06 22:29 
user profile iconatarigold hat folgendes geschrieben:
Versuche mal die LocalSQL Funktion EXTRACT (sollte auch mit Paradox funktionieren):


ausblenden 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 user profile iconChristian 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 20.02.06 03:48 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.

_________________
Na denn, dann. Bis dann, denn.