Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Monate berechnen zwischen zwei datums (https://www.delphipraxis.net/45108-monate-berechnen-zwischen-zwei-datums.html)

peter12 29. Apr 2005 21:25

Re: Monate berechnen zwischen zwei datums
 
Derzeit habe ich folgenten Code

dat.datum.CalendarDate := query1geb_datum.value;
while now > dat.date do
begin
dat.datum.NextMonth;
inc (r);
end;

Monate := r;


peter

Strophi 29. Apr 2005 21:47

Re: Monate berechnen zwischen zwei datums
 
Hi,

Zitat:

Zitat von Hansa
Zitat:

Zitat von Strophi
...Ich finde die Formulierung schon im ersten Post verständlich...

Na also, dann sage ihm was zu tun ist. Oder ist das auch nur ein ??? überflüssiges Posting ???

Wieso, Du hast die Antwort doch schon gehabt, und sie ihm aus Nickelichkeit nicht gegeben...

mfg

Strophi

Hansa 29. Apr 2005 21:54

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von Strophi
...Wieso, Du hast die Antwort doch schon gehabt, und sie ihm aus Nickelichkeit nicht gegeben...

Soweit ich weiß liegt Hollywood in Kalifornien. :mrgreen: Also liefere jetzt endlich die Antwort. 8)

Strophi 29. Apr 2005 22:32

Re: Monate berechnen zwischen zwei datums
 
Hi,

Ich habe gesagt, ich habe sein Problem verstanden, aber nicht das ich eine Antwort hätte.
Aber ich weiß worauf Du hinauswillst.
Du als 3K+Beiträge-Member, schüttelst doch sowas aus dem Ärmel, lächelst doch drüber.
Du hast die Antwort, wie du gerade anmerktest, also los...

mfg

strophi

Phoenix 29. Apr 2005 23:35

Re: Monate berechnen zwischen zwei datums
 
JUNGS! Alle beide! Reisst Euch gefälligst zusammen.

1) Anzahl an Beiträgen ist keineswegs ein Kriterium für Wissen
2) Das hat HIER überhaupt nichts zu suchen
3) Das Problem ist bekannt, darüber braucht nicht diskutiert zu werden
4) Das Landet gleich bei einem Mod wenn ihr Euch weiter so aufführt :roll:

So, und nun zur Problemlösung:

Schritt 1:
Drösele beide Daten nach Tag, Monat und Jahr auf.
Dann vergleiche erstmal die Jahre. Sind diese Unterschiedlich nehme die Differenz dazwischen. Ziehe nun noch eins ab und multipliziere mit 12. Damit hast Du erstmal die Monate der jahresdifferenz. Das eine Jahr wird abgezogen, weil das erste Jahr nicht ungebdingt voll ist (im Beispiel ist es da, aber egal).

Dann rechnest Du weiter: 13 - Monat im Geburtstag (ist die Anzahl der begonnen Monate im ersten nicht unbedingt vollen Jahr) das zum vorherigen dazuaddieren. Dann rechnest Du noch die Monatszahl des zweiten Datums dazu.

Beispiel: 17.01.1979 (mein Geburtstag) und heute 29.04.2005
Differenz der Jahre: 2005 - 1979 = 26.
Minus eins, mal 12: 26-1 = 25; 25 * 12 = 300
13 - Monat im Gebtag. und zur Summe addieren: 13 - 1 = 12; 300 + 12 = 312
Aktueller Monat aufaddieren: 312 + 4 = 316

==> Ich bin 316 Monate alt. Prüfung: 316 / 12 = 26,33333
Ich bin 26, stimmt schonmal und 12 durch 3,333 = 3,6 Monate. 3,6 Monate sind seit Januar auch schon vergangen ==> Passt also.

Wenn die beiden Jahreszahlen Identisch sind ist es eh einfacher: Monat im Vergleichsdatum - Monat im Geburtstag -1 => Ferdsch.

MisterNiceGuy 29. Apr 2005 23:57

Re: Monate berechnen zwischen zwei datums
 
Hauptsache ich werd hier angemacht :smile2:

Dabei kann man mit den paar Beriffen die ich ihm da hingeworfen hab doch schon was anfangen oder? :mrgreen:

peter12 30. Apr 2005 07:48

Re: Monate berechnen zwischen zwei datums
 
Danke für die Lösung an Phoenix

Hab die Code mußte 1 Monat abziehen .


var Year, Month,Day ,Year2, Month2,Day2: Word;
Geburtsdatum : tdate; r : integer;
begin
Geburtsdatum := strtodate(edit1.text);
DecodeDate(Geburtsdatum, Year, Month,Day);
DecodeDate(now, Year2, Month2,Day2);
r := (((Year2-Year)-1)*12)+12-Month+Month2
end;
Peter

marabu 30. Apr 2005 07:58

Re: Monate berechnen zwischen zwei datums
 
@peter12:

Messen kannst du nur mit einer Norm. Monate stellen keine Norm dar, sie haben unterschiedlich viele Tage. Du musst also als erstes eine Norm definieren, die bei grober Betrachtung mit einem Kalendermonat gleich gesetzt werden kann. Wenn dein Monat der zwölfte Teil eines Jahres sein soll, dann hast du folgende Möglichkeiten:
  • Nimm das arithmetische 100 jährige Mittel.
  • Nimm das arithmetische Mittel im Betrachtungszeitraum.
  • Verwende die Rechenweise der Banken.
Mir fallen gerade keine sinnvollen Alternativen mehr ein.

Grüße vom marabu

malo 30. Apr 2005 08:09

Re: Monate berechnen zwischen zwei datums
 
Ich hab mal eine (relativ) genaue Funktion geschrieben, die auch auf die verschiedenen Monate achtet. Schaltjahre werden zwar nicht berücksichtigt, aber... schauts euch mal an:

Delphi-Quellcode:
function GetMonths(aDate: TDate): integer;
var
  years, months, days: word;
begin
  DecodeDate(aDate, years, months, days);
  case months of
    1: Months := Months + days div 31;
    2: Months := Months + days div 28;
    3: Months := Months + days div 31;
    4: Months := Months + days div 30;
    5: Months := Months + days div 31;
    6: Months := Months + days div 30;
    7: Months := Months + days div 31;
    8: Months := Months + days div 31;
    9: Months := Months + days div 30;
    10: Months := Months + days div 31;
    11: Months := Months + days div 30;
    12: Months := Months + days div 31;
  end;
  Months := Months + years * 12;
  result := Months;
end;
Damit kann man jetzt EIN Datum in Monate aufspalten. Mit einem zweiten Aufruf dieser Funktion kann man auch die Differenz ausrechnen.

Hoffe, ich konnte dir helfen!

Mfg malo

//edit: nicht auf funktionalität geprüft!
//edit2: Und nochmal die Funktion, aber etwas genauer (mit Nachkommastellen):
Delphi-Quellcode:
function GetMonths(aDate: TDate): extended;
var
  years, months, days: extended;
begin
  DecodeDate(aDate, years, months, days);
  case months of
    1: Months := Months + days / 31;
    2: Months := Months + days / 28;
    3: Months := Months + days / 31;
    4: Months := Months + days / 30;
    5: Months := Months + days / 31;
    6: Months := Months + days / 30;
    7: Months := Months + days / 31;
    8: Months := Months + days / 31;
    9: Months := Months + days / 30;
    10: Months := Months + days / 31;
    11: Months := Months + days / 30;
    12: Months := Months + days / 31;
  end;
  Months := Months + years * 12;
  result := Months;
end;
Wieder ungetestet, sollte aber funktionieren.

peter12 30. Apr 2005 12:34

Re: Monate berechnen zwischen zwei datums
 
Danke für die Hilfe

Möchte diese Berechnung in STored Procedures ablaufen lassen.
Da sich ja das Alter in Monaten jeden Tag ändern kann.
Versuchte folgenden Code
SQL-Code:
create PROCEDURE RI_ALT (
    JAHR SMALLINT,
    MONAT SMALLINT)
AS
DECLARE VARIABLE R INTEGER;
begin
  for
  select nr,extract(year from geb_datum) as y,
  extract(month from geb_datum) as mon from rinder
  where id_nr < 20000
   into :jahr,:monat,:r
  do begin
  r = y;
   r = (((jahr-y)-1)*12)+12-mon+monat;
   update rinder set alter_ = :r where nr = 1209;
   end
  suspend;
end
Bekomme aber Fehler da die Nr und y und mon von der Tabelle rinder nicht erkannt werden.

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
Y.
At line 13, column 7.

Ist es nicht möglich die Tabelle Rinder durchzulaufen und die Spalte Alter_ zu aktualisieren.

Verwende Firebird 1.5

peter

[edit=Sharky]SQL-Tags gesetzt. Mfg, Sharky[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:02 Uhr.
Seite 2 von 4     12 34      

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 by Thomas Breitkreuz