Seite 1 von 1

Datum eingrenzen Abfragen. [ERLEDIGT]

Verfasst: Mi, 31. Jan 2024 7:59
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?

Re: Datum eingrenzen Abfragen.

Verfasst: Mi, 31. Jan 2024 8:17
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 */


Re: Datum eingrenzen Abfragen.

Verfasst: Mi, 31. Jan 2024 8:40
von Manfred
das ergibt aber jetzt das hier.
gebdat.PNG
gebdat.PNG (2.84 KiB) 1253 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.

Re: Datum eingrenzen Abfragen.

Verfasst: Mi, 31. Jan 2024 8:45
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

Re: Datum eingrenzen Abfragen.

Verfasst: Mi, 31. Jan 2024 9:44
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).