Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Jahrestage innerhalb der nächsten x Tage abfragen (https://www.delphipraxis.net/78944-jahrestage-innerhalb-der-naechsten-x-tage-abfragen.html)

smudo 13. Okt 2006 13:30

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:
select p.*
from PERSONDATES p
order by (extract(month from p.DATUM)), (extract(day from p.DATUM))
Wie kann ich mir jetzt die nächsten Jahrestage innerhalb von x Tagen ausgeben lassen?

Gruß

René

Jürgen Thomas 13. Okt 2006 14:20

Re: Jahrestage innerhalb der nächsten x Tage abfragen
 
Grundgedanke:
SQL-Code:
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)
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.

Viel Erfolg! Jürgen

smudo 13. Okt 2006 15:27

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:
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é

Jürgen Thomas 13. Okt 2006 16:35

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:
  • Datumsvergleiche werden als Strings der Form 'MMTT' vorgenommen.
  • Start- und EndeDatum werden am Anfang der SProc konvertiert.
  • SELECT erfolgt BETWEEN StartDatum AND EndeDatum
  • Die Konvertierung kommt in eine SProc oder in eine UDF.
Ich verzichte darauf, das auszubauen, weil Du ja eine funktionsfähige Lösung hast und ich nicht weiß, ob Du es perfektionieren willst (und weil ich es für mich noch zurückstelle).

Gruß Jürgen

smudo 16. Okt 2006 13:00

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é

joachimd 16. Okt 2006 15:03

Re: Jahrestage innerhalb der nächsten x Tage abfragen
 
Zitat:

Zitat von smudo
Wie kann ich mir jetzt die nächsten Jahrestage innerhalb von x Tagen ausgeben lassen?

Wenn Du den Jahreswechsel nicht berücksichtigen musst:
SQL-Code:
where dayofyear(a.gebdat)-dayofyear(curdate()) between 0 and 5

Jürgen Thomas 16. Okt 2006 16:42

Re: Jahrestage innerhalb der nächsten x Tage abfragen
 
Zitat:

Zitat von joachimd
Zitat:

Zitat von smudo
Wie kann ich mir jetzt die nächsten Jahrestage innerhalb von x Tagen ausgeben lassen?

Wenn Du den Jahreswechsel nicht berücksichtigen musst:
SQL-Code:
where dayofyear(a.gebdat)-dayofyear(curdate()) between 0 and 5

Auf so eine einfache Formulierung muss man erst mal kommen.

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

joachimd 16. Okt 2006 16:46

Re: Jahrestage innerhalb der nächsten x Tage abfragen
 
Zitat:

Zitat von Jürgen Thomas
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

Ich kenne Firebird nicht im Detail. Bei ADS (und auch bei ein paar anderen) ist die Funktion im Lieferumfang.

smudo 17. Okt 2006 08:41

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