Entwickler-Ecke

Datenbanken - Datenbank und Datumsformat


WIng2005 - Do 16.02.06 11:09
Titel: Datenbank und Datumsformat
Hallo,

bin eher ein Noop, was die Delphiprogrammierung angeht. Scheiter irgendwie schon an folgendem:

Ich schreibe einen "Geburtstagsreminder", der bei jedem Systemstart in seiner Datenbank schaut, ob heute +- 3 Tage jemand Geburtstag hat oder hatte.
Die Ergebnisse sollen in 3 Listbox-Komponenten angezeigt werden (hatte, heute , wird haben). Wenn ich in der DB die Geburtstage eingebe, enthalten diese
ja auch das Geburtsjahr (Typ: Datum). Die Suche nach dem Geburtstag, kann dieses jedoch nicht enthalten. Hat jemand von euch eine Idee, wieso

Form2.Table1.Locate('Geburtstag',datum2,[lopartialkey])

nicht funktioniert, wenn in 'Geburtstag' meine Daten und in Datum2 bspw. "16.02" (datum2:= formatdatetime('dd.mm',(now)) steht?
Vergebe ich Datum2 bspw. "16.02.85" wird dieser Eintrag in der DB gefunden.
Wäre euch echt dankbar.....sitz da schon ein paar Nächte dran.

MFG
Steffen


afk - Do 16.02.06 11:44
Titel: Re: Datenbank und Datumsformat
Wenn die Datenbankspalte für den Geburtstag ein Datumstyp ist, dann wird das Datum nicht im String-Format gespeichert, sondern normalerweise als Fließkammazahl, in die das Datum hineinkodiert ist. Daher kann so ein Vergleich gar kein vernünftiges Ergebnis bringen.

Wenn die Datenbank SQL beherscht, dann ist es in jedem Falle besser, das per SQL-Query zu lösen und die Arbeit vom DBMS machen zu lassen. Die sollte dann entsprechende Funktionen zur Verfügung stellen.

Gruß Axel


WIng2005 - Do 16.02.06 12:49

Ich dachte an eine Art Platzhalter. Die Variable datum2 so umgewandelt, dass nach "16.02.****" gesucht wird.
Ansonsten, müßte ich die Spalte Geburtstag als String mit 10 Zeichen Umwandeln. Das Ausschnittsweise Suchen, sollte doch dann
mit [lopartialkey] funktionieren, oder?


MFG
Steffen


WIng2005 - Do 16.02.06 14:36

Mmmh, habe mal die String-Version getestet, funzt. Fraglich ist jedoch, wie man mehrfacheinträge finden, also weitersuchen kann.

Vielen Dank für die Hilfe.
MFG
Steffen


uwewo - Do 16.02.06 20:56

Hi,

Axel hat recht probiere es mit SQL

Bsp MySQL:

select Name, Datum
from Tabelle
where Datum between curdate()-3 and curdate()+3

sollte Dir die gewünschten Ergebnise bringen

Uwe


WIng2005 - Do 16.02.06 23:08

Na dann...
bin grad erst am Lernen. Hatte mir mal 3 Bücher gekauft und wollte mal was Eigenes machen.
MySQL kommt erst noch...
Aber vielen Dank für den Tip. Hatte es jetzt erstmal "provisorisch" gelöst:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
Procedure Pruefung(Eintrag:integer);
var j :integer;
Begin
for j:=1 to form2.Table1.RecordCount do
begin
  form2.Table1.RecNo:=j;
  form2.dbgrid1.SelectedField:=form2.Table1.FieldByName('Geburtstag');
  datum2:=formatdatetime('dd.mm',(now)+Eintrag)  ;
  datum1:=copy(form2.DBEdit2.Text,1,5);
  if (( comparetext(datum1,datum2)))=0 then
    begin
      case Eintrag of
      -1: form1.ListBox1.Items.Add(form2.Table1.FieldByName('Name').AsString);
       0: form1.ListBox2.Items.Add(form2.Table1.FieldByName('Name').AsString);
       1: form1.ListBox3.Items.Add(form2.Table1.FieldByName('Name').AsString);
    end;
    end;
end;
end;


Eintrag wird jeweils mit -1,0,1 übergeben.DBEdit1 enthält den Namen und DBEdit2 das Datum.
Naja, wie gesagt....ma lernt halt noch....

MFG und vielen Dank
Steffen