![]() |
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 |
Re: Monate berechnen zwischen zwei datums
geht's noch unklarer???????????????
|
Re: Monate berechnen zwischen zwei datums
Schau mal unter
![]() |
Re: Monate berechnen zwischen zwei datums
Gibts aber erst ab D6 iirc.
|
Re: Monate berechnen zwischen zwei datums
Hm geht nicht date1(TDate) - date2???
|
Re: Monate berechnen zwischen zwei datums
Na klar geht das, aber keine Antwort mit diesen spärlichen Informationen. Siehe Niveau. :mrgreen:
|
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 |
Re: Monate berechnen zwischen zwei datums
Zitat:
Ich finde die Formulierung schon im ersten Post verständlich. Seit dieser vermaledeiten Niveau-Diskussion wird es hier aber rau... mfg strophi |
Re: Monate berechnen zwischen zwei datums
Zitat:
|
Re: Monate berechnen zwischen zwei datums
Zitat:
|
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] |
Re: Monate berechnen zwischen zwei datums
Entschuldige habe Fehler gefunden
SQL-Code:
Danke an Malo und Phoenix
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 peter [edit=Sharky]SQL-Tags gesetzt. Mfg, Sharky[/edit] |
Re: Monate berechnen zwischen zwei datums
Eine Bitte noch:
Verwende, um Delphi Quellcode anzuzeigen, bitte die -Tags. Danke :) |
Re: Monate berechnen zwischen zwei datums
Zitat:
|
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... |
Re: Monate berechnen zwischen zwei datums
Zitat:
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:
p.s. Irgendwie mag ich deine mitdenkende Art. Was man auch in GlkIrgendwas' Thread sehen konnte. :) |
Re: Monate berechnen zwischen zwei datums
Zitat:
Zitat:
Zitat:
|
Re: Monate berechnen zwischen zwei datums
Zitat:
Zitat:
Zitat:
![]() |
Re: Monate berechnen zwischen zwei datums
Zitat:
marabu |
Re: Monate berechnen zwischen zwei datums
Zitat:
|
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 |
Re: Monate berechnen zwischen zwei datums
Zitat:
SQL-Code:
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.
SELECT ((:aktueller_tag - geb_tag) / 30.4375) AS monate FROM rinder ...
Grüße vom marabu |
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:
Ist übersichtlicher.
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; |
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:
btw:...
SELECT ((Current_Date - Geb_Tag) / 30.4375) as AlterInMonaten
FROM Rinder WHERE Miep = :Mööp @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
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