![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: UIB
Jahrestage innerhalb der nächsten x Tage abfragen
Hallo :hi: ,
ich hab eine Tabelle mit einer Menge von Daten. Mit folgender Query kann ich die Ergebnisse nach Jahrestagen (also unabhängig vom Jahr) anzeigen:
SQL-Code:
Wie kann ich mir jetzt die nächsten Jahrestage innerhalb von x Tagen ausgeben lassen?
select p.*
from PERSONDATES p order by (extract(month from p.DATUM)), (extract(day from p.DATUM)) Gruß René |
Re: Jahrestage innerhalb der nächsten x Tage abfragen
Grundgedanke:
SQL-Code:
Ich habe jetzt nicht überlegt, an welcher Stelle die 'Feldnamen' Tag und Monat einzuführen sind und ob dies in verknüpfte Selects umzuwandeln ist; aber in dieser Richtung solltest Du überlegen.
SELECT CAST( (Tag || '.' || Monat || '.' || extract(year from Current_Date) AS DATE)
from PERSONDATES p between Current_Date AND (Current_Date + x) order by (extract(month from p.DATUM) AS Monat), (extract(day from p.DATUM) AS Tag) Viel Erfolg! Jürgen |
Re: Jahrestage innerhalb der nächsten x Tage abfragen
Ich hab mir mal ein paar SPs dafür gebastelt, mit denen ich an daa Ergebnis komme:
SQL-Code:
Ändert das Jahr eines Datums auf NewYear
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
SQL-Code:
hängt bei in der Vergangenheit liegenden Jahrestagen das Jahr 2004 bei allen ab heute eine 2000 an.
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 2000 und 2004 wegen Schaltjahr, um eventuelle 29.2. umwandeln zu können.
SQL-Code:
Liefert mir die nächsten x Ereignisse. Das ganze auf die nächsten x Tage zu beschränken, sollte damit ebenfalls kein Problem sein.
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 Falls das jemand viel zu umständlich findet und 'ne bessere Idee hat: Immer her damit. René |
Re: Jahrestage innerhalb der nächsten x Tage abfragen
Hallo René,
als Lösungsverfahren klingt es gut. Ich nehme an, dass Du es entsprechend getestet hast. Mir gefällt daran nicht, dass dabei im eigentlichen Select jeder Datensatz einzeln über 2 andere Procedures geschickt wird. Ich habe jetzt folgende Idee (in etwa einem halben Jahr werde ich ebenfalls eine Selektion für Geburtstage u.ä. in mein Projekt einbauen, aber noch befasse ich damit nicht) mit folgenden Grundgedanken:
Gruß Jürgen |
Re: Jahrestage innerhalb der nächsten x Tage abfragen
Hallo Jürgen,
das die Datensätze einzeln von den Prozeduren bearbeitet werden, hat mich anfangs auch abgeschrickt. Bei den Datenmengen, um welche es sich in diesem Fall handelt (kaum mehr als 1000), bereitet das allerdings keine Probleme, die Tests liefen problemlos. Dein Vorschlag ist zu dem, was ich eigentlich gefragt hatte, einfacher und wahrscheinlich performanter. Einziger Nachteil den ich sehe: außerhalb eines Schaltjahres wird es zu Problemen mit dem 29.2.xx kommen. Danke und viele Grüße René |
Re: Jahrestage innerhalb der nächsten x Tage abfragen
Zitat:
SQL-Code:
where dayofyear(a.gebdat)-dayofyear(curdate()) between 0 and 5
|
Re: Jahrestage innerhalb der nächsten x Tage abfragen
Zitat:
Könnte es sein, dass DayOfYear als UDF kein Standard-SQL ist und nicht zu FB gehört, aber in ADS enthalten ist? Jürgen |
Re: Jahrestage innerhalb der nächsten x Tage abfragen
Zitat:
|
Re: Jahrestage innerhalb der nächsten x Tage abfragen
Hallo Joachim,
leider hat Jürgen Recht: Firebird sagt "Function unknown" bei Verwendung von DayOfYear. Außerdem ist mir der Jahreswechsel schon sehr wichtig - mit meinen Prozeduren klappt das ja auch. Also in diesem Fall werde ich wohl bei meiner Variante bleiben. Vielen Dank für die Anregungen René |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz