![]() |
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 |
Re: Monate berechnen zwischen zwei datums
Hi,
Zitat:
mfg Strophi |
Re: Monate berechnen zwischen zwei datums
Zitat:
|
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 |
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. |
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: |
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 |
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:
Grüße vom marabu |
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:
Damit kann man jetzt EIN Datum in Monate aufspalten. Mit einem zweiten Aufruf dieser Funktion kann man auch die Differenz ausrechnen.
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; 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:
Wieder ungetestet, sollte aber funktionieren.
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; |
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:
Bekomme aber Fehler da die Nr und y und mon von der Tabelle rinder nicht erkannt werden.
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 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. |
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