Entwickler-Ecke

Datenbanken - Stringdatum auslesen SQL


D. Annies - Do 06.10.11 15:27
Titel: Stringdatum auslesen SQL
Hi, Delpher,

ich will ein Geburtsdatum der Form tt.mm.jjjj, das (leider) als String in einer Tabelle vorliegt, auf "heute Geburtstag" prüfen,
d.h. der Tag und der Monat müssen stimmen. Wie lautet denn dafür ein SQL-Befehl?

Ich habe zwei StringVariablen Tg und Mo : Integer deklariert.
Brauche ich da Parameter? Hilft LIKE da iwi weiter?


Delphi-Quelltext
1:
2:
3:
4:
5:
format('select Name, Vorname, Klasse, Gebdat, Telefon from "%s" ' +
                            'where  ????? = :MONAT and ????? = :TAG ' +
                            'order by Name, Vorname, Klasse', [TbName]);
      Qx.ParamByName('Tag').AsString := inttostr(Tg);
      Qx.ParamByName('Monat').AsString := inttostr(Mo);


Vielen Dank für eine Hilfe,
Detlef


guinnes - Do 06.10.11 15:34

In MySQL gibts die Stringfunktionen Left, Mid, und right, damit geht es definitiv


jasocul - Do 06.10.11 15:45

guinness hat schon Recht, aber da sind auch noch viele Dinge zu beachten. Z.B.: Sind Tag und Monat immer 2-stellig?

Ich arbeite mit Oracle und dort gibt es die Möglichkeit mit der Funktion "to_date" einen String in ein Kalenderdatum zu wandeln. Wenn man dazu noch die Funktionen "Day" und "Month" auf das Datum anwendet, sollte es auch funktionieren.


D. Annies - Do 06.10.11 16:06

1. to_day wird nicht erkannt.

2. left auch nicht: (?)

Delphi-Quelltext
1:
2:
3:
4:
5:
qx.SQL.Text := format('select Name, Vorname, Klasse, Gebdat, Telefon from "%s" ' +
                            'where left(gebdat,2) = :MONAT and Mid(gebdat,4,2) = :TAG ' +
                            'order by Name, Vorname, Klasse', [TbName]);
      Qx.ParamByName('Tag').AsString := inttostr(Tg);
      Qx.ParamByName('Monat').AsString := inttostr(Mo);

oder habe ich es falsch benutzt?

cu, Detlef


jasocul - Do 06.10.11 16:09

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
1. to_day wird nicht erkannt.

In Oracle heißt es to_date. iirc heißte es bei Standard-SQL nur "date".
to_day habe ich nirgendwo geschrieben. :wink:


guinnes - Do 06.10.11 16:17

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
      Qx.ParamByName('Tag').AsString := inttostr(Tg);
      Qx.ParamByName('Monat').AsString := inttostr(Mo);

Denke daran, daß dabei u.U. ein einstelliges Datum ( Tag bzw Monat ) bei rauskommt


D. Annies - Do 06.10.11 16:19

Entschuldige meinen Schreibfehler.

Left scheint doch erkannt zu werden, aber nicht mid:


Delphi-Quelltext
1:
2:
3:
4:
5:
qx.SQL.Text := format('select Name, Vorname, Klasse, Gebdat, Telefon from "%s" ' +
                            'where left(gebdat,2) = :MONAT and mid(gebdat, 4,2) = :TAG ' +
                            'order by Name, Vorname, Klasse', [TbName]);
      Qx.ParamByName('Tag').AsString := inttostr(Tg);
      Qx.ParamByName('Monat').AsString := inttostr(Mo);


Habe ich etwas falsch geschrieben?


D. Annies - Do 06.10.11 17:58

Na, ja, so geht es:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TAG_MON := inttostr(Tg) +'.' + inttostr(Mo);
  if TbSchueler.Fieldbyname('gebdat').DataType = ftString then
  begin
    showmessage('lets go');
    qx.Close;
      qx.SQL.Text := format('select Name, Vorname, Klasse, Gebdat, Telefon from "%s" ' +
                            'where left(gebdat,5) = :TAG_MON ' +
                            'order by Name, Vorname, Klasse', [TbName]);
      Qx.ParamByName('Tag_Mon').AsString := Tag_Mon;
    qx.Open;
;

bis denne,
Detlef