Ich hab mir mal ein paar SPs dafür gebastelt, mit denen ich an daa Ergebnis komme:
SQL-Code:
ALTER PROCEDURE CHANGEYEAR (
OLDDATE DATE,
NEWYEAR INTEGER)
RETURNS (
NEWDATE DATE)
AS
begin
NEWDATE = cast((extract(day from OLDDATE) || '.' || extract(month from OLDDATE) || '.' || NEWYEAR) as date);
suspend;
end
Ändert das Jahr eines Datums auf NewYear
SQL-Code:
ALTER PROCEDURE GETRELATIVEDATE (
BASICDATE DATE,
COMPAREDATE DATE)
RETURNS (
OUTDATE DATE)
AS
begin
select newdate from CHANGEYEAR(:BASICDATE, 2000) into BASICDATE;
select newdate from CHANGEYEAR(:COMPAREDATE, 2000) into OUTDATE;
if (OUTDATE < BASICDATE) then
select newdate from CHANGEYEAR(:OUTDATE, 2004) into OUTDATE;
suspend;
end
hängt bei in der Vergangenheit liegenden Jahrestagen das Jahr 2004 bei allen ab heute eine 2000 an.
2000 und 2004 wegen Schaltjahr, um eventuelle 29.2. umwandeln zu können.
SQL-Code:
ALTER PROCEDURE GETNEXTDAYS (
MAXDATES INTEGER,
STARTDAT DATE)
RETURNS (
NAME VARCHAR(35),
DATUM DATE)
AS
DECLARE VARIABLE COUNTER INTEGER;
begin
COUNTER = 0;
for select p.NAME, p.DATUM
from PERSONDATES p
order by (select outdate from GETRELATIVEDATE(current_date, p.DATUM))
into :NAME, :DATUM
do
begin
if (COUNTER < MAXDATES) then suspend;
COUNTER = :COUNTER + 1;
end
end
Liefert mir die nächsten x Ereignisse. Das ganze auf die nächsten x Tage zu beschränken, sollte damit ebenfalls kein Problem sein.
Falls das jemand viel zu umständlich findet und 'ne bessere Idee hat: Immer her damit.
René