Delphi-PRAXiS

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 20:04


Monate berechnen zwischen zwei datums
 
Gibt es eine schneller Möglichkeit die Monate zwischen zwei Datums berechen.
Ohne den Datumskalendar hinaufzuzählen >>> wird bei Jahre zwischen den Datums langsam.
Und in einer Stored Procedure (Firebird) nicht realisieren.

peter

bttb930 29. Apr 2005 20:12

Re: Monate berechnen zwischen zwei datums
 
geht's noch unklarer???????????????

gmarts 29. Apr 2005 20:13

Re: Monate berechnen zwischen zwei datums
 
Schau mal unter Delphi-Referenz durchsuchenMonthsbetween nach.

Jasocul 29. Apr 2005 20:17

Re: Monate berechnen zwischen zwei datums
 
Gibts aber erst ab D6 iirc.

MisterNiceGuy 29. Apr 2005 20:35

Re: Monate berechnen zwischen zwei datums
 
Hm geht nicht date1(TDate) - date2???

Hansa 29. Apr 2005 21:05

Re: Monate berechnen zwischen zwei datums
 
Na klar geht das, aber keine Antwort mit diesen spärlichen Informationen. Siehe Niveau. :mrgreen:

peter12 29. Apr 2005 21:10

Re: Monate berechnen zwischen zwei datums
 
MisterNiceGuy hat geschrieben

Hm geht nicht date1(TDate) - date2???
nicht Tage sondern Monate

Ich möchte die exakten angefangene Monate zwischen zwei Datumsangaben
keine berechnet MonthsBetween eine Näherung, indem 30,4375 Tage pro Monat zugrundegelegt werden.


Ich möchte in einer Firebird Datenbank von Geburtsdatum jewals zum Zugriffsdatum das Alter in Monate
(angefangene Monat) berechnen.
peter

Strophi 29. Apr 2005 21:16

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von Hansa
Na klar geht das, aber keine Antwort mit diesen spärlichen Informationen. Siehe Niveau. :mrgreen:

Vielleicht ist er kein deutscher Muttersprachler, hast Du Dich das gefragt?
Ich finde die Formulierung schon im ersten Post verständlich.



Seit dieser vermaledeiten Niveau-Diskussion wird es hier aber rau...


mfg

strophi

Hansa 29. Apr 2005 21:20

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von peter12
...Ohne den Datumskalendar hinaufzuzählen...Und in einer Stored Procedure (Firebird) nicht realisieren...

Was, welcher Kalender ? Wie sieht die SP momentan aus ? :shock:

Hansa 29. Apr 2005 21:24

Re: Monate berechnen zwischen zwei datums
 
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 ???

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]

peter12 30. Apr 2005 12:51

Re: Monate berechnen zwischen zwei datums
 
Entschuldige habe Fehler gefunden
SQL-Code:
create PROCEDURE RI_ALT (
    JAHR SMALLINT,
    MONAT SMALLINT)
AS
DECLARE VARIABLE R INTEGER;
DECLARE VARIABLE JAHR1 SMALLINT;
DECLARE VARIABLE MONAT1 SMALLINT;
DECLARE VARIABLE T INTEGER;
begin
  for
  select nr,extract(year from geb_datum),
  extract(month from geb_datum) from rinder
  where id_nr < 20000
   into :t,:jahr1,:monat1
  do begin

   r = (((jahr-jahr1)-1)*12)+12-monat1+monat;
   update rinder set alter_ = :r where nr = :t;
   end
  suspend;
end
Danke an Malo und Phoenix

peter

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

malo 30. Apr 2005 13:03

Re: Monate berechnen zwischen zwei datums
 
Eine Bitte noch:

Verwende, um Delphi Quellcode anzuzeigen, bitte die -Tags. Danke :)

Hansa 30. Apr 2005 13:14

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von malo
..um Delphi Quellcode anzuzeigen, bitte die -Tags. Danke :)

Da hat er Recht. Aber es gibt sogar SQL-Tags. Wäre hier schon besser als Delphi-Tags. :lol:

marabu 30. Apr 2005 17:11

Re: Monate berechnen zwischen zwei datums
 
Wahrscheinlich sind es Perlen vor die Rinder geworfen, aber mit der abgebildeten SP-Rechenvorschrift werden die Rinder gelegentlich einen Monat zu früh geschlachtet. Nicht das mich das besonders stören würde, wohl eher den Leiter des Wirtschaftsbetriebes.

Wegen der Kurzlebigkeit "moderner" Rinder habe ich den Norm-Monat zu 365.25 / 12 Tagen festgelegt.

Nehmen wir als Testfall 2004-02-29 als AktuellesDatum und 2005-04-01 als GeburtsDatum. Das Monatsalter errechnet sich dann nach der Formel mAge = AlterInTagen / NormMonat zu 13,0 Monaten. Die SP berechnet mit der Formel 12 * (AktuellesJahr - GeburtsJahr) - GeburtsMonat + AktuellerMonat ein Alter von 14 Monaten. Peng - das Rind ist tot.

Nachdenkliche Grüße vom marabu

PS: Bin mir nicht so sicher, ob ich sowas überhaupt in einer Stored Procedure machen würde.
PPS: Bin mir fast sicher, dass ich das Alter nicht in der Tabelle speichern würde.
PPPS: Wahrscheinlich guckt wieder kein Schwein hin...

Robert_G 30. Apr 2005 17:48

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von marabu
PS: Bin mir nicht so sicher, ob ich sowas überhaupt in einer Stored Procedure machen würde.

Wo sonst? :gruebel:
Es sollte sicherlich NICHT im Client laufen. Einen BL Tier wird Peter wohl nicht haben. (Nehme ich jetzt einfach anhand des erkennbaren Kenntisstandes aus dem Bauch raus an. ;) )
Bleibt also nur eine SP bzw. UDF (In FB kann man ja keine Funktionen schreiben... )
Zitat:

Zitat von marabu
PPS: Bin mir fast sicher, dass ich das Alter nicht in der Tabelle speichern würde.

Genau! Einen berechneten Wert speichern widersprecht allem was als Normalform oder wenigstens als halbwegs konsistent durchgehen könnte. ;)
Zitat:

Zitat von marabu
PPPS: Wahrscheinlich guckt wieder kein Schwein hin...

Wie immer... :roll:

p.s.
Irgendwie mag ich deine mitdenkende Art. Was man auch in GlkIrgendwas' Thread sehen konnte. :)

marabu 30. Apr 2005 18:04

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von Robert_G
Wo sonst? :gruebel:

Ich würde es im SELECT Statement machen.

Zitat:

Zitat von Robert_G
Irgendwie mag ich deine mitdenkende Art.

Dann trau ich mich mal: Hör auf mit der Verunstaltung seines Namens, sonst sag ich Jeffrey Bescheid

Zitat:

Zitat von Robert_G
Was man auch in GlkIrgendwas' Thread sehen konnte. :)

Kenn ich nicht - postet da jemand in meinem Namen?

Robert_G 30. Apr 2005 18:08

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von marabu
Zitat:

Zitat von Robert_G
Wo sonst? :gruebel:

Ich würde es im SELECT Statement machen.

Das schon, aber der code sollte zentral liegen und notfalls getaucht werden können.

Zitat:

Zitat von marabu
Dann trau ich mich mal: Hör auf mit der Verunstaltung seines Namens, sonst sag ich Jeffrey Bescheid

:duck: Schon passiert...
Zitat:

Zitat von marabu
Zitat:

Zitat von Robert_G
Was man auch in GlkIrgendwas' Thread sehen konnte. :)

Kenn ich nicht - postet da jemand in meinem Namen?

Ich meinte den Tread ;)

marabu 30. Apr 2005 18:20

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von Robert_G
Zitat:

Zitat von marabu
Zitat:

Zitat von Robert_G
Wo sonst? :gruebel:

Ich würde es im SELECT Statement machen.

Zitat:

Zitat von Robert_G
Das schon, aber der code sollte zentral liegen und notfalls getaucht werden können.

Hast Recht - wer weiß, wie ich die Monate morgen berechne.

[not exactly off topic]Mein SQL-Code steht aber auch nicht im Programm-Quelltext![/not exactly off topic]

Zitat:

Zitat von marabu
Zitat:

Zitat von Robert_G
Was man auch in GlkIrgendwas' Thread sehen konnte. :)

Kenn ich nicht - postet da jemand in meinem Namen?

Ich meinte den Tread ;)

Oh Gott - ich hatte wohl einen Knoten im Schnabel. Na ja, werde mal so alt wie ich bin - dann passiert dir sowas auch noch.

marabu

Robert_G 30. Apr 2005 18:27

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von marabu
Oh Gott - ich hatte wohl einen Knoten im Schnabel. Na ja, werde mal so alt wie ich bin - dann passiert dir sowas auch noch.

Lass mal... Dafür tauche ich meine SQL Statements. :mrgreen: *platsch*

peter12 30. Apr 2005 19:07

Re: Monate berechnen zwischen zwei datums
 
Gebe ihnen Recht. Es muß auch der Tag einbezogen werden.
Sie würden es in eine SELECT Statement machen?

Bitte um etwas Nachsicht für meine Fragen .
Bin blutiger Anfänger und programmiere nur für den Privatgebrauch oder Freunden (Freeware ).

Ich glaube das es in SP gut aufgehoben ist .
Da das Monat nur einmal im Tag berechnet werden muß.
Und somit bei den ganzen Auswertungen und Listen nicht hundert mal berechnet werden muß.

Lasse mich aber gerne eines besseren belehren.

Kann mir den code in einer SELECT Anweisung nicht vorstellen.

Bitte prügelt mich nicht für meine Unwissenheit .
Ich versuche zu lernen.

was meint Ihr unter

Quellcode-Tags


peter

marabu 30. Apr 2005 19:49

Re: Monate berechnen zwischen zwei datums
 
Zitat:

Zitat von peter12
Sie würden es in eine SELECT Statement machen?

Oui mon ami - du kannst das Geburtsdatum des Rindes als geb_tag = Trunc(geb_datum) speichern und mit
SQL-Code:
SELECT ((:aktueller_tag - geb_tag) / 30.4375) AS monate FROM rinder ...
das Alter in Monaten abfragen. Dazu musst du nur Trunc(now) als Parameterwert in deiner Query-Komponente verwenden. Bei der Darstellung könntest du eine Nachkommastelle dran lassen - als kleine Zusatzinformation.

Grüße vom marabu

3_of_8 30. Apr 2005 19:58

Re: Monate berechnen zwischen zwei datums
 
@peter:

Quellcode-Tags sind das:

Man schreibt
Code:
[Delphi]
Hier der Delphi-Programmcode
[/Delphi]
.

Dann wird der Code schön formatiert, ungefähr so:
Delphi-Quellcode:
procedure formcreate(Sender: TObject);
var I: Integer;
    StrLst: TStringList;
begin
strlst:=TStringList.create;
for I:=1 to 5 do
begin
if trim(paramstr(I)='') then break;
strlst.add(paramstr(I));
end;
showmessage('Es wurden '+inttostr(I)+' Parameter übergeben.';
strlst.free;
end;
Ist übersichtlicher.

Robert_G 30. Apr 2005 20:02

Re: Monate berechnen zwischen zwei datums
 
Ein anonymer Erbsenzähler würde fast behaupten, dass die Systemzeit eines Clients als nicht vertrauenswürdig eingestuft werden muss. ;)
Dafür bekommt man in Firebird das aktuelle Datum per Current_Date auf dem Silbertablett. ;)
SQL-Code:
SELECT ((Current_Date - Geb_Tag) / 30.4375) as AlterInMonaten
FROM  Rinder
WHERE Miep = :Mööp
btw:...
@Peter
Du solltest dir enrsthaft überlegen brauchbare Spaltennamen zu suchen. ;)
Unterstriche sind bei DB'lern seltsamerweise beliebt. Sie sind bei Programmierern verhasst, da sie den Lesefluss kaputtmachen und im Allgemeinen enfach nur hässlich aussehen. ;)
Firebird gibt dir doch genug Zeichen für deine Bezeichner um es Geburtsdatum oder Birthdate zu nennen.
Mit einer IDE wie IbExpert bekommst du auch noch code completion, wodurch der Tippaufwand als Ausrede ausgedient hat. :P

DP-Maintenance 1. Mai 2005 07:12

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "VCL / WinForms / Controls" nach "Datenbanken" verschoben.
Das ganze hat sich jetzt ja zu einem DB-Thread entwickelt ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 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