Datum eingrenzen Abfragen. [ERLEDIGT]

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Datum eingrenzen Abfragen. [ERLEDIGT]

Beitrag von Manfred »

Ich habe die Aufgabe aus einer Tabelle die nächsten 5 personen zu ermitteln, die ab dem aktuellen Tag Geburtstag haben. Wie geht man an sowas dran? Nach Datum kann ich ja nicht sortieren, da die jahreszahl ja auch eine Rolle spielt und somit immer die ganz alten am Anfang drin stehen und die ganz jungen eher nicht. Oder sollte sowas über einen 2. Weg gelöst werden, das also erstmal alle ermittelt werden, die vom Tag und Monat her infrage kommen und dann später im Programm nochmal filtern?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Datum eingrenzen Abfragen.

Beitrag von Marcus Herz »

in etws so: (für ADS)

Code: Alles auswählen

select top 5 tabelle.* 
(day(geburtstag) + month(geburtstag)*100 +		
iif( month(geburtstag) = 12,  0, 10000)) as sort     /* zum verständnis */
from tabelle 
where iif( month(geburtstag) = month(curdate()), day(geburtstag) >= day(curdate()) and month(geburtstag) = month(curdate()) ,   /* alle diesen Monat ab heute */
month(geburtstag) <> month(curdate()))			/* alle anderen monate */

order by 
day(geburtstag) + month(geburtstag)*100 +		/* pseudo sortierung */
iif( month(geburtstag) = 12,  0, 10000) 			/* sprung ins nächste jahr */

Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Datum eingrenzen Abfragen.

Beitrag von Manfred »

das ergibt aber jetzt das hier.
gebdat.PNG
gebdat.PNG (2.84 KiB) 880 mal betrachtet
ich kann aber leider nicht erkennen, was jetzt wo am Script noch angepaßt werden muß. Denn eigentlich dürften keine Geburtstage aus der Vergangenheit auftauchen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Datum eingrenzen Abfragen.

Beitrag von Marcus Herz »

Code: Alles auswählen

select top 5 tabelle.* 
(day(geburtstag) + month(geburtstag)*100 +		
iif( month(geburtstag) = 12,  0, 10000)) as sort     /* zum verständnis */
from tabelle 
where iif( month(geburtstag) = month(curdate()), day(geburtstag) >= day(curdate()) and month(geburtstag) = month(curdate()) ,   /* alle diesen Monat ab heute */
month(geburtstag) <> month(curdate()))			/* alle anderen monate */

order by 
day(geburtstag) + month(geburtstag)*100 +		/* pseudo sortierung */
iif( month(geburtstag) = 12 and month(curdate()) = 12,  0, 10000) 			/* sprung ins nächste jahr */
da hat am Ende noch eine Bedingung gefehlt
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 651
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Datum eingrenzen Abfragen.

Beitrag von nightcrawler »

um ganz sicher zu gehen, brauchst Du zunächst eine Liste mit allen kommenden Tagen:

Code: Alles auswählen

create PROCEDURE AlleTageZwischenDatum
   ( 
      starttermin date,
      endtermin date,
      tag DATE OUTPUT
   ) 
BEGIN 
  //Timestamp ist in ADS einfacher als Date
  DECLARE @ts TIMESTAMP;
  DECLARE @te TIMESTAMP;
  @ts = CAST(_starttermin as SQL_TIMESTAMP);
  @te = CAST(_endtermin as SQL_TIMESTAMP);
  
  WHILE @ts <= @te DO
    INSERT INTO __output(tag) VALUES(cast(@ts as SQL_DATE));
	@ts=TIMESTAMPADD( SQL_TSI_DAY, 1, @ts);
  END;
END;
diese Liste wird mit den Geburtstagen verbunden (nur tag und monat):

Code: Alles auswählen

select d.tag, p.name, p.dob, year(d.tag)-year(dob) as "alter"  
from person p
JOIN (execute procedure AlleTageZwischenDatum(date(), date()+365)) d on 
  day(dob)=day(d.tag) and month(dob)=month(d.tag)
order by d.tag
Damit bekommst Du alle Geburtstage der nächsten 365 Tage....gerne auch der nächsten 2....x Jahre. Mit TOP X schränkst du die Rückgbe ein (falls nur zwei Mitarbeiter da sind, gibt es trotzdem die nächsten 5 Geburtstage....halt mit Abstand).
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten