![]() |
Zeiträume verwalten
Hallo,
ich habe eine Menge von Zeiträumen (StartDatum - Enddatum) Diese können sich beliebig überschneiden. Beispiel:
Ich möchte nun wissen, wieviele Zeiträume maximal bzw. minimal bzw. zu einem bestimmten Zeitpunkt aktiv wahren Hier also:
Wie kann man das am Besten lösen? Die Daten liegen in einer DB vor, deshalb wäre SQL das Beste. Ich bin aber auch dankbar für jede andere Lösungsmöglichkeit. Vielen Dank René |
Re: Zeiträume verwalten
Ich würde es mit TDateTime machen.
Da kannst du jedes Dateum deiner Intervalle umrechnen lassen ein einen Double wert. DAnn must du nur noch Zahlenwerte Vergleichen und das ist dann hoffentlich kein Problem mehr . |
Re: Zeiträume verwalten
Hallo René,
deine Fragestellung ist nicht klar genug. Zitat:
SQL-Code:
Grüße vom marabu
SELECT COUNT(*) FROM tabelle WHERE von <= :zeitpunkt and bis >= :zeitpunkt
|
Re: Zeiträume verwalten
Zitat:
versuche es einmal in folgender Richtung:
SQL-Code:
Für die anderen Abfragen nach Max/Min fällt mir zunächst nur der Umweg über StoredProcedures ein:
/* geeignet für die letzte Abfrage */
SELECT COUNT(*) FROM Table WHERE :Vergleichsdatum BETWEEN StartDatum AND EndDatum;
SQL-Code:
Warnung: Ich habe das schnell hingeschrieben ohne exakte Kontrolle der Schreibweisen und Prüfung, ob dieser CAST wirklich so funktioniert; für andere SQL-Dialekte muss es ggf. anders formuliert werden. Auch kann ich mir lebhaft vorstellen, dass es schnellere Wege gibt.
CREATE PROCEDURE Maximalwert ( VglVon DATE, VglBis DATE )
RETURNS ( Anzahl INTEGER ) AS BEGIN SELECT MAX(*) FROM Zwischenwerte( VglVon, VglBis ); SUSPEND; END ^ /* unter Verwendung der folgenden StoredProcedure */ CREATE PROCEDURE Zwischenwerte( VglVon DATE, VglBis DATE ) RETURNS ( Anzahl INTEGER ) AS DECLARE VARIABLE iAkt INTEGER; DECLARE VARIABLE iBis INTEGER; DECLARE VARIABLE Vergleichsdatum DATE; BEGIN iAkt = CAST(VglVon AS INTEGER); iBis = CAST(VglBis AS INTEGER); WHILE (iAkt <= iBis) DO BEGIN Vergleichsdatum = CAST(iAkt AS DATE); SELECT COUNT(*) FROM Table WHERE :Vergleichsdatum BETWEEN StartDatum AND EndDatum; INTO :Anzahl; SUSPEND; iAkt = iAkt + 1; END END ^ Aber vielleicht liefert Dir das erfolgreiche Anregungen. Gruß Jürgen |
Re: Zeiträume verwalten
Ich formuliere es mal etwas deutlicher:
Der SP-Ansatz von Jürgen Thomas sieht sehr interessant aus, ich werde das mal nachbauen. Im Moment versuche ich's in ähnlicher Weise über eine Delphi-Routine ohne SQL. |
Re: Zeiträume verwalten
Wie speicherst du die Werte, wie oben vorgeschlagen in einer Datenbank?
|
Re: Zeiträume verwalten
PersNr DatumVon DatumBis
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 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