AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Jahrestage innerhalb der nächsten x Tage abfragen
Thema durchsuchen
Ansicht
Themen-Optionen

Jahrestage innerhalb der nächsten x Tage abfragen

Ein Thema von smudo · begonnen am 13. Okt 2006 · letzter Beitrag vom 17. Okt 2006
Antwort Antwort
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#1

Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 13. Okt 2006, 14:30
Datenbank: Firebird • Version: 1.5 • Zugriff über: UIB
Hallo ,

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é
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

Re: Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 13. Okt 2006, 15:20
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 13. Okt 2006, 16:27
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é
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#4

Re: Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 13. Okt 2006, 17:35
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 16. Okt 2006, 14:00
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é
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#6

Re: Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 16. Okt 2006, 16:03
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:
where dayofyear(a.gebdat)-dayofyear(curdate()) between 0 and 5
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#7

Re: Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 16. Okt 2006, 17:42
Zitat von joachimd:
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:
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#8

Re: Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 16. Okt 2006, 17:46
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
smudo

Registriert seit: 6. Sep 2005
Ort: Cottbus
362 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Jahrestage innerhalb der nächsten x Tage abfragen

  Alt 17. Okt 2006, 09:41
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é
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz