Mir ist da grad was in die Finger gefallen, das wollte ich Euch mal
fragen:
Um z.B. das Alter einer Person zu berechnen wird ja oft die
undokumentierte Funktion DATEDIF genannt. Gerade letztens fragte
jemand nach der Berechnung (ohne VBA) fᅵr historische Personen die vor
1900 gelebt haben.
Nun ja, dachte ich, mit VBA wᅵre das ein Klacks, man kᅵnnte ja die
DATEDIF in VBA nachbilden. Geht auch kein Thema, aaaaaaaaaaaber:
DATEDIF rechnet ja gar nicht richtig, wenn man es mit "md", "ym"
aufruft!???!!
Dann habe ich gesucht und gesucht, nicht viel gefunden, alle Lᅵsungen
rechnen falsch:
A1 30.01.2004
B1 02.03.2004
C1 =DATEDIF($A1;$B1;"y")
D1 =DATEDIF($A1;$B1;"ym")
E1 =DATEDIF($A1;$B1;"md")
F1 =DATEDIFVBA($A1;$B1;"y")
G1 =DATEDIFVBA($A1;$B1;"ym")
H1 =DATEDIFVBA($A1;$B1;"md")
A2 31.07.2002
B2 26.03.2003
C2 =DATEDIF($A2;$B2;"y")
D2 =DATEDIF($A2;$B2;"ym")
E2 =DATEDIF($A2;$B2;"md")
F2 =DATEDIFVBA($A2;$B2;"y")
G2 =DATEDIFVBA($A2;$B2;"ym")
H2 =DATEDIFVBA($A2;$B2;"md")
Vom 30.01.2004 bis 02.03.2004 sind es
0 Jahre 1 Monat, 2 Tage und nicht 0 Jahre 1 Monat, 1 Tage
Vom 31.07.2002 bis 26.03.2003 sind es
1 Jahre 7 Monat, 26 Tage und nicht 1 Jahre 7 Monat, 23 Tage
Auch die Formeln auf
http://www.excelformeln.de/formeln.html?welcher=141
liefern das gleiche falsche Ergebnis.
Gibt es da eine VBA-Lᅵsung die (fᅵr alle Excel-Versionen) richtig rechnet?
Andreas.
#Const Version = 1
Function DateDifVBA(ByVal Datum1 As Date, ByVal Datum2 As Date, _
ByVal Zeiteinheit As String) As Long
'Die DATEDIF-Funktion auch fᅵr Daten vor 1900
'Zeiteinheit:
'y Anzahl kompletter Jahre
'm Anzahl kompletter Monate
'd Anzahl der Tage
'md Unterschied in Tagen, wobei Monate und Jahre ignoriert _
werden
'ym Unterschied in Monaten, Tage und Jahre bleiben _
unberᅵcksichtigt
'yd Unterschied in Tagen, wobei die Jahre ignoriert werden
#If Version = 1 Then
Dim I As Integer
Zeiteinheit = LCase(Left(Zeiteinheit, 2))
For I = 1 To Len(Zeiteinheit)
Select Case Mid(Zeiteinheit, I, 1)
Case "y"
DateDifVBA = DateDiff("yyyy", Datum1, Datum2, _
vbUseSystemDayOfWeek, vbUseSystem)
If Datum1 > DateSerial(Year(Datum1), Month(Datum2), _
Day(Datum2)) Then DateDifVBA = DateDifVBA - 1
Datum1 = DateSerial(Year(Datum1) + DateDifVBA, Month( _
Datum1), Day(Datum1))
Case "m"
DateDifVBA = DateDiff("m", Datum1, Datum2, _
vbUseSystemDayOfWeek, vbUseSystem)
If Datum1 > DateSerial(Year(Datum1), Month(Datum1), _
Day(Datum2)) Then DateDifVBA = DateDifVBA - 1
Datum1 = DateSerial(Year(Datum1), Month(Datum1) + _
DateDifVBA, Day(Datum1))
Case "d"
DateDifVBA = DateDiff("d", Datum1, Datum2, _
vbUseSystemDayOfWeek, vbUseSystem)
End Select
Next
#End If
#If Version = 2 Then
Dim Day1 As Integer, Day2 As Integer, Days As Integer
Dim Month1 As Integer, Month2 As Integer, Months As Integer
Dim Year1 As Integer, Year2 As Integer, Years As Integer
Date2DMY Datum1, Day1, Month1, Year1
Date2DMY Datum2, Day2, Month2, Year2
'{days first}
If Day1 > Day2 Then
Month2 = Month2 - 1
If Month2 = 0 Then
Month2 = 12
Year2 = Year2 - 1
End If
Day2 = Day2 + DaysInMonth(DateSerial(Year2, Month2, 1))
End If
Days = Day2 - Day1
'{now months and years}
If Month1 > Month2 Then
Month2 = Month2 + 12
Year2 = Year2 - 1
End If
Months = Month2 - Month1
Years = Year2 - Year1
Zeiteinheit = LCase(Left(Zeiteinheit, 2))
Select Case Zeiteinheit
Case "y"
DateDifVBA = Years
Case "m"
DateDifVBA = Years * 12 + Months
Case "d"
DateDifVBA = DateDiff("d", Datum1, Datum2, _
vbUseSystemDayOfWeek, vbUseSystem)
Case "ym"
DateDifVBA = Months
Case "md"
DateDifVBA = Days
End Select
#End If
End Function
#If Version = 2 Then
Sub Date2DMY(ByVal Datum As Date, ByRef Tag, ByRef Monat, _
ByRef Jahr)
'Wandelt ein Datum in Tag, Monat, Jahr
Tag = Day(Datum)
Monat = Month(Datum)
Jahr = Year(Datum)
End Sub
Function DaysInMonth(ByVal Datum As Date) As Integer
'Liefert die Anzahl der Tage des Monats in dem Datum liegt
DaysInMonth = Day(DateSerial(Year(Datum), Month(Datum) + 1, _
1) - 1)
End Function
#End If
Weder noch. 3 wᅵre richtig.
> Vom 31.07.2002 bis 26.03.2003 sind es
> 1 Jahre 7 Monat, 26 Tage und nicht 1 Jahre 7 Monat, 23 Tage
Stimmt. 26 ist korrekt.
> Gibt es da eine VBA-Lᅵsung die (fᅵr alle Excel-Versionen) richtig rechnet?
Kannst Du mal diese php-Lᅵsung testen. Ist zwar extrem langsam, aber zum
Testen reicht es. Du mᅵsstest dazu vorᅵbergehend diese beiden php-Files
direkt nach C:\ kopieren:
http://home.arcor.de/peter.schleif/php-win.exe (24 KB)
http://home.arcor.de/peter.schleif/php5ts.dll (5618 KB)
Aufruf: =phpDateDiff("md";$A1;$B1)
erlaubt: y, m, d, md
Function phpDateDiff(interval As String,d1 As Date, d2 As Date)
Static wsh As Object
Dim exe As Object
Dim cmd As String
Dim arr As Variant
Const php = "C:\php-win.exe"
cmd = cmd & "date_default_timezone_set('Europe/Berlin');"
cmd = cmd & "$date = new DateTime('" _
& Format(d2, "YYYY-MM-DD") & "');"
cmd = cmd & "$d = $date->diff(new DateTime('" _
& Format(d1, "YYYY-MM-DD") & "'));"
cmd = cmd & "echo $d->y.'|'.$d->m.'|'.$d->d.'|'.$d->days;"
If wsh Is Nothing Then Set wsh = CreateObject("WScript.Shell")
Set exe = wsh.Exec(php & " -r """ & cmd & """")
arr = Split(exe.StdOut.ReadAll & " ", "|")
If UBound(arr) <> 3 Then
phpDateDiff = "#PHPDATEDIFF!"
Else
Select Case LCase(interval)
Case "y": phpDateDiff = Val(arr(0))
Case "m": phpDateDiff = Val(arr(1))
Case "d": phpDateDiff = Val(arr(2))
Case "md": phpDateDiff = Val(arr(3))
End Select
End If
Set exe = Nothing
End Function
>> Vom 30.01.2004 bis 02.03.2004 sind es
>> 0 Jahre 1 Monat, 2 Tage und nicht 0 Jahre 1 Monat, 1 Tage
>
>Weder noch. 3 w�re richtig.
Warum?
Und warum ist es �berhaupt abh�ngig vom Schaltjahr?
vom 1.1.20xx bis zum 31.8.20xx sind es nicht immer
genau 8 Monate?
Gibt es eine eindeutige Definition f�r "Monat" in diesem Kontext?
Ist es nicht vom 1.1.2009 bis 31.1.2009 ein Monat
Und vom 1.2.2009 bis zum 28.2.2009 auch genau ein Monat,
ebenso vom 1.6.2009 bis zum 30.6.2009?
Martin
--
Da lief Philippus hin und h�rte, da� er den Propheten Jesaja las,
und fragte: Verstehst du auch, was du liest? Er aber sprach: Wie
kann ich, wenn mich nicht jemand anleitet?
[Apost. 8, 30-31]
Am Sat, 12 Dec 2009 17:34:38 +0100 schrieb Martin Hentrich:
> Gibt es eine eindeutige Definition f�r "Monat" in diesem Kontext?
>
> Ist es nicht vom 1.1.2009 bis 31.1.2009 ein Monat
> Und vom 1.2.2009 bis zum 28.2.2009 auch genau ein Monat,
> ebenso vom 1.6.2009 bis zum 30.6.2009?
bei "m" sind es die *vollst�ndigen* Monate im Zeitraum.
Bei "ym" ist es die Differenz zwischen den Monaten im Anfangsdatum und dem
Enddatum. Die Tage und Jahre der Datumswerte werden dabei ignoriert.
Mit freundlichen Gr�ssen
Claus Busch
--
Win XP PRof SP2 / Vista Ultimate SP2
Office 2003 SP2 /2007 Ultimate SP2
Meiner Meinung macht es Sinn, von kleinerem zum grᅵᅵeren Datum zu gehen
und dabei zuerst die Tage, dann die Monate, dann die Jahre hochzuzᅵhlen
bis man jeweils Gleichstand mit dem zugehᅵrigen Wert des grᅵᅵeren Datums
erreicht hat. Fᅵr die "30.01.2004" / "02.03.2004" bedeutet das:
30.01.2004 Start fᅵr Tag-Angleich
31.01.2004 1 Tag
01.02.2204 2 Tage
02.02.2004 3 Tage -> Gleichstand bei den Tagen erreicht.
02.02.2004 Start fᅵr Monats-Angleich
02.03.2004 1 Monat -> Gleichstand bei den Monaten erreicht.
02.03.2004 Start fᅵr Jahres-Angleich.
Nichts zu tun. -> Gleichstand bei den Jahren erreicht.
Macht zusammen: 0/1/3. Das deckt sich auch mit dem Ergebnis in PHP, dem
ich in diesem Fall mehr traue als einer (tatsᅵchlich undokumentierten?)
Excel/VBA-Funktion - sorry.
Aber es gibt sicherlich andere Algorithmen, die zu anderen Ergebnissen
kommen. Vielleicht liegt ja genau da die Problematik.
> vom 1.1.20xx bis zum 31.8.20xx sind es nicht immer
> genau 8 Monate?
Nein. 7 Monate und 30 Tage
> Ist es nicht vom 1.1.2009 bis 31.1.2009 ein Monat
Nein. 0 Monate 30 Tage
> Und vom 1.2.2009 bis zum 28.2.2009 auch genau ein Monat,
Nein. 0 Monate 27 Tage
> ebenso vom 1.6.2009 bis zum 30.6.2009?
Nein. 0 Monate 29 Tage
Peter
Am Sat, 12 Dec 2009 18:02:59 +0100 schrieb Peter Schleif:
> Macht zusammen: 0/1/3. Das deckt sich auch mit dem Ergebnis in PHP, dem
> ich in diesem Fall mehr traue als einer (tats�chlich undokumentierten?)
> Excel/VBA-Funktion - sorry.
seit xl2000 ist DateDif in der Online-Hilfe dokumentiert. Allerdings sind
f�r die Zeiteinheiten falsche Argumente angegeben.
Puh, dann hab ich flasch gefragt:
>> vom 1.1.20xx bis zum 31.8.20xx sind es nicht immer
>> genau 8 Monate?
>
>Nein. 7 Monate und 30 Tage
Und sind sind dann
vom 1.1.20xx bis zum 1.9.20xx sind es dann aber immer
genau 8 Monate? Schaltjahr hin oder her?
>> Ist es nicht vom 1.1.2009 bis 31.1.2009 ein Monat
>
>Nein. 0 Monate 30 Tage
Aha. Dann ist ein Tag mehr = 31 Tage aber ein Monat:
Vom 1.1.2009 bis 1.2.2009 ein Monat
>> Und vom 1.2.2009 bis zum 28.2.2009 auch genau ein Monat,
>
>Nein. 0 Monate 27 Tage
Aha. Dann ist ein Tag mehr = 28 Tage auch ein Monat:
Vom 1.2.2009 bis 1.3.2009 ein Monat, Schaltjahrunabh�ngig.
>> ebenso vom 1.6.2009 bis zum 30.6.2009?
>
>Nein. 0 Monate 29 Tage
Aha. Dann ist ein Tag mehr = 30 Tage aber ein Monat:
Vom 1.6.2009 bis 1.7.2009 ein Monat
Jetzt ist es mir mit deiner Erl�uterung klarer. Der Monatsbegriff
kommt also vom "Z�hlmonat" und Schaltjahre sollten keine Rolle
spielen, wenn der Differenzzeitraum mehr als ein Monat betr�gt. Bei
Differenzen unter einem Monat, bei denen der 29.2. dazwischen liegt,
spielt das Schaltjahr sehr wohl eine Rolle, aber eben nur dann. Dies
trifft auch auf Differenzen unterb einem Monat mit einem Monatswechsel
dazwischen zu.
Meiner Meinung nach korrekt. Aber, wie gesagt, kann das durch andere
Algorithmen auch anders aussehen. Ich finde es so richtig.
> [...] Bei
> Differenzen unter einem Monat, bei denen der 29.2. dazwischen liegt,
> spielt das Schaltjahr sehr wohl eine Rolle, aber eben nur dann.
Nicht nur dann. Auch bei Differenzen _ᅵber_ einem Monat, wenn der Tag
des kleineren Datums im Februar liegt und dieser Tag grᅵᅵer ist als der
Tag des grᅵᅵeren Datums. Dann kommt man beim Hochzᅵhlen der Tage
zwangslᅵufig am 29.Februar vorbei und muss diesen natᅵrlich mitzᅵhlen.
Peter
DATEDIF rechnet "isoliert", findet man auf diese Weise heraus: Es nimmt (bei
Endtag<Starttag) den Vormonat (=Februar) des Ende-Datums (im M�rz) und setzt
dessen Anzahl Tage als Messlatte. Was aber interessiert uns der Vormonat zum
Endedatum? Relevant muss die L�nge des Monats des Startdatums sein, wenn
Datumstag B1< Datumstag A1.
Du hast jedenfalls recht: Das ergibt hier und allgemein einen
konzeptionellen Fehler in DATEDIF.
=TAG(B1)-TAG(A1)+(TAG(B1)<TAG(A1))*TAG(DATUM(JAHR(A1);MONAT(A1)+1;))
w�re anscheinend f�r Datedif(...;"md") richtig. Die Formel ber�cksichtigt
f�r das Startdatum die relevante L�nge des Startmonats und nicht willk�rlich
die des Vormonats zum Endedatum als Messlatte. Bitte testen und Fehler
melden ;-)
--
Moin+Gruss Alexander - MVP for MS Excel - www.xxcl.de - mso2000sp3 --7-2
Zur "Was ist ein Monat?"-Diskussion: Ein Monat ist letztlich eine vom
Menschen willk�rlich festgelegte Distanz (wenn auch astronomisch
unterf�ttert). Ein Jahr letztlich auch. So wollen wir uns bei der Ermittlung
von MD einfach an diese Konvention halten ...
http://xxcl.de/0028.htm, http://xxcl.de/0064.htm
> Meiner Meinung nach korrekt. Aber, wie gesagt, kann das durch andere
> Algorithmen auch anders aussehen. Ich finde es so richtig.
Ich finde Du hast hier eine klare, nachvollziehbare Logik, ganz
Klasse! Ich kann mich dem nur anschlieᅵen.
>> [...] Bei
>> Differenzen unter einem Monat, bei denen der 29.2. dazwischen liegt,
>> spielt das Schaltjahr sehr wohl eine Rolle, aber eben nur dann.
> Nicht nur dann. Auch bei Differenzen _ᅵber_ einem Monat, wenn der Tag
> des kleineren Datums im Februar liegt und dieser Tag grᅵᅵer ist als der
> Tag des grᅵᅵeren Datums. Dann kommt man beim Hochzᅵhlen der Tage
> zwangslᅵufig am 29.Februar vorbei und muss diesen natᅵrlich mitzᅵhlen.
Okay, dann mᅵssen wir jetzt eigentlich nur noch eines klᅵren:
Sind es vom 29.02.2000 zum 28.02.2003 nun genau 3 Jahre?
Ich denke ja, Deiner Logik folgend auch ja.
phpDateDiff liefert hier jedoch 2 Jahre 11 Monate 28 Tage.
Und vom 31.12.2003 bis 30.04.2005 mᅵssten es 1 Jahr und 4 Monate sein?
Und vom 30.01.2004 bis 29.02.2008 mᅵssten es 4 Jahre und 1 Monat sein?
Andreas.
2/11/28
> Ich denke ja, Deiner Logik folgend auch ja.
Neeeee. Siehe Text unten.
> phpDateDiff liefert hier jedoch 2 Jahre 11 Monate 28 Tage.
Meiner Meinung nach liegt PHP hier richtig.
> Und vom 31.12.2003 bis 30.04.2005 mᅵssten es 1 Jahr und 4 Monate sein?
1/3/30
> Und vom 30.01.2004 bis 29.02.2008 mᅵssten es 4 Jahre und 1 Monat sein?
4/0/30. PHP liefert hier noch was anderes: 4/1/1
"Mein" Algorithmus vergleicht zuerst den Tag des kleineren Datum mit dem
Tag des des grᅵᅵeren Datums. Ist der kleinereTag <= grᅵᅵererTag so wird
einfach die Differenz berechnet. Ist er aber grᅵᅵer, so muss der
kleinere Tag bis zum grᅵᅵeren hochgezᅵhlt werden; ᅵber das Monatsende
hinweg und unter Berᅵcksichtigung der individuellen Anzahl der Tage des
kleineren Monats. Der Monat des kleineren Tages erhᅵht sich dadurch
natᅵrlich auch um 1 und das Jahr auch, falls der kleinere Monat Dezember
war. Darauf basierend werden dann die Differenzen fᅵr Monat und Jahr
gebildet.
Vielleicht schaffe ich es heute noch eine VBA-Funktion zu programmieren.
Hier schon mal ein Ansatz:
If d1 > d2 Then
swap = d1
d1 = d2
d2 = swap
End If
If Day(d1) <= Day(d2) Then
anzahl_tage = Day(d2) - Day(d1)
Else
'/Bemerkung Month() funktioniert auch mit 13 Monaten/
anzahl_tage = DateSerial(Year(d1),Month(d1)+1,Day(d2)) - d1
End If
Peter
>> Sind es vom 29.02.2000 zum 28.02.2003 nun genau 3 Jahre?
> 2/11/28
>> Ich denke ja, Deiner Logik folgend auch ja.
> Neeeee. Siehe Text unten.
Der Text liefert aber keine Logik. Ich sage mal dies:
Wenn vom 1. dieses Monats bis zum 1. des nᅵchsten Monats oder
vom 15. bis zum 15. des nᅵchsten Monats genau 1 Monat und 0 Tage
vergangen sind, dann muss vom Ende dieses Monats bis zum Ende des
nᅵchsten Monats auch genau 1 Monat und 0 Tage vergangen sein und nicht
0 Monate und 30, 28 oder 29 Tage.
> Vielleicht schaffe ich es heute noch eine VBA-Funktion zu programmieren.
Hab ich schon (noch Beta-Version), vielen Dank.
Andreas.
Function ADateDif(ByVal Datum1 As Date, ByVal Datum2 As Date, _
ByVal Zeiteinheit As String) As Long
'Die DATEDIF-Funktion ist fehlerhaft, diese funktioniert _
zudem auch fᅵr Daten vor 1900
'Zeiteinheit:
'y Anzahl kompletter Jahre
'm Anzahl kompletter Monate
'd Anzahl der Tage
'md Unterschied in Tagen, wobei Monate und Jahre ignoriert _
werden
'ym Unterschied in Monaten, Tage und Jahre bleiben _
unberᅵcksichtigt
'yd Unterschied in Tagen, wobei die Jahre ignoriert werden
Dim Day1 As Integer, Day2 As Integer, Days As Integer
Dim Month1 As Integer, Month2 As Integer, Months As Integer
Dim Year1 As Integer, Year2 As Integer, Years As Integer
Dim Temp As Date
'Datum2 muss grᅵᅵer als Datum1 sein
If Datum1 > Datum2 Then
Temp = Datum1
Datum1 = Datum2
Datum2 = Temp
End If
Day1 = Day(Datum1)
Month1 = Month(Datum1)
Year1 = Year(Datum1)
Day2 = Day(Datum2)
Month2 = Month(Datum2)
Year2 = Year(Datum2)
If Day1 > Day2 Then
'ᅵberlappt das Ende des Monats?
If Month(Datum2 + 1) <> Month2 Then
Days = 0
Else
Month1 = Month1 + 1
'Year2: den 29.Februar mitzᅵhlen!
Days = Day(DateSerial(Year2, Month1, 1) - 1) - Day1 + Day2
End If
Else
Days = Day2 - Day1
End If
If Month1 > Month2 Then
Year1 = Year1 + 1
Months = 12 - Month1 + Month2
Else
Months = Month2 - Month1
End If
Years = Year2 - Year1
Zeiteinheit = LCase(Left(Zeiteinheit, 2))
Select Case Zeiteinheit
Case "y"
ADateDif = Years
Case "m"
ADateDif = Years * 12 + Months
Case "d"
ADateDif = Datum2 - Datum1
Case "yd"
Datum2 = DateSerial(Year1, Month2, Day2)
If Datum2 > Datum1 Then
ADateDif = Datum2 - Datum1
Else
ADateDif = Datum1 - Datum2
End If
Case "ym"
ADateDif = Months
Case "md"
ADateDif = Days
End Select
End Function
Diese Regeln kriegst Du niemals widerspruchsfrei unter einen Hut. Ich
extrahiere aus deinem Text:
a) 1. eines Monats bis 1. des Folgemonat -> 1 Monat
b) 15. eines Monats bis 15. des Folgemonat -> 1 Monat
c) Letzter eines Monats bis Letzter des Folgemonat -> 1 Monat
Nun wende ich deine Regeln auf die folgenden vier Datenpaare an:
1. 28.02.09 - 28.03.09 -> 1 Monat (Regel a bzw. b)
2. 28.02.09 - 29.03.09 -> ???
3. 28.02.09 - 30.03.09 -> ???
4. 28.02.09 - 31.03.09 -> 1 Monat (Regel c)
Was willst Du bei 2.+3. eintragen?
Sollen alle vier Tage die gleiche Differenz bekommen?
Oder willst Du am 29.Mᅵrz 1 Tag draufgeben, am 30.Mᅵrz 2 Tage und am 31
wieder auf einen glatten Monat zurᅵckfallen?
> Hab ich schon (noch Beta-Version), vielen Dank.
> [...CODE ...]
Schau ich mir morgen mal an. Beste Dank.
Peter
> Diese Regeln kriegst Du niemals widerspruchsfrei unter einen Hut. Ich
> extrahiere aus deinem Text:
>
> a) 1. eines Monats bis 1. des Folgemonat -> 1 Monat
> b) 15. eines Monats bis 15. des Folgemonat -> 1 Monat
> c) Letzter eines Monats bis Letzter des Folgemonat -> 1 Monat
Also für sollche komplizierte Fragen wenn ich mich immer
vertrauensvoll an meine Frau und die sagt dazu ja. :-)))
Auf der anderen Seite sagt sie aber auch das die Menschen die am 29.2.
geboren sind Ihren Geburtstag am 1.3. feiern, wenn kein Schaltjahr
ist. Gibt es hierzu eigentlich eine offizielle (staatliche) Meinnung
wie alt so jemand am 28.2. ist?
> Nun wende ich deine Regeln auf die folgenden vier Datenpaare an:
...
> Sollen alle vier Tage die gleiche Differenz bekommen?
Eigentlich ja, 1 Monat.
Wenn vom 1. zum 1. die Differenz genau 1 Monat ist, warum sollte die
Differenz je einen Tag davor eine andere sein? Macht für mich
irgendwie keinen Sinn.
Man müsste doch so wie AUFGELZINS mit Basis 4 (Europa 30/360) rechnen,
oder?
Fragt sich wie das diesbezüglich geht... muss ich mal drüber
nachdenken...
Andreas.
Das fᅵhrt dann zu der lustigen Situation, dass die Menschen fᅵr einige
Tage nicht altern. Seltsame Vorstellung. :-)
Tag der Geburt: 28.02.79
28.02.79 - 25.03.09 -> 30 Jahre, 0 Monate, 25 Tage
28.02.79 - 26.03.09 -> 30 Jahre, 0 Monate, 26 Tage
28.02.79 - 27.03.09 -> 30 Jahre, 0 Monate, 27 Tage
28.02.79 - 28.03.09 -> 30 Jahre, 1 Monat, 0 Tage
28.02.79 - 29.03.09 -> 30 Jahre, 1 Monat, 0 Tage
28.02.79 - 30.03.09 -> 30 Jahre, 1 Monat, 0 Tage
28.02.79 - 31.03.09 -> 30 Jahre, 1 Monat, 0 Tage
28.02.79 - 01.04.09 -> 30 Jahre, 1 Monat, 1 Tag
28.02.79 - 02.04.09 -> 30 Jahre, 1 Monat, 2 Tage
28.02.79 - 03.04.09 -> 30 Jahre, 1 Monat, 3 Tage
Aber mein Ansatz sieht hier auch nicht besser aus. Der wᅵrde zwar am
Monatsende weiterzᅵhlen, dafᅵr aber am 1.April um zwei Tage
zurᅵckspringen. Der Mensch wᅵrde also jᅵnger! Auch seltsam.
28.02.79 - 25.03.09 -> 30 Jahre, 0 Monate, 25 Tage
28.02.79 - 26.03.09 -> 30 Jahre, 0 Monate, 26 Tage
28.02.79 - 27.03.09 -> 30 Jahre, 0 Monate, 27 Tage
28.02.79 - 28.03.09 -> 30 Jahre, 1 Monat, 0 Tage
28.02.79 - 29.03.09 -> 30 Jahre, 1 Monat, 1 Tag
28.02.79 - 30.03.09 -> 30 Jahre, 1 Monat, 2 Tage
28.02.79 - 31.03.09 -> 30 Jahre, 1 Monat, 3 Tage
28.02.79 - 01.04.09 -> 30 Jahre, 1 Monat, 1 Tag
28.02.79 - 02.04.09 -> 30 Jahre, 1 Monat, 2 Tage
28.02.79 - 03.04.09 -> 30 Jahre, 1 Monat, 3 Tage
Nun ja. Offensichtlich kᅵnnen wir uns nicht auf eine gemeinsame
Definition einigen. Dann macht es aber auch keinen Sinn ᅵber einen
Algorithmus zu diskutieren oder gar ᅵber dessen Implementierung. Ich
werde mich darum an dieser Stelle erstmal ausklinken, behalte das Thema
aber im Hinterkopf und werde es demnᅵchst nochmal aufgreifen.
Weiterhin viel Erfolg.
Peter
> Du hast jedenfalls recht: Das ergibt hier und allgemein einen
> konzeptionellen Fehler in DATEDIF.
Naja, irgendwas werden sich die Amis dabei wohl gedacht haben, ich
habe in anderen Quellcodes (auch in meinen alten Pascalcodes)
Berechnungen gefunden die das gleiche Ergebnis wie DATEDIF liefern.
> =TAG(B1)-TAG(A1)+(TAG(B1)<TAG(A1))*TAG(DATUM(JAHR(A1);MONAT(A1)+1;))
>
> wᅵre anscheinend fᅵr Datedif(...;"md") richtig. Die Formel berᅵcksichtigt
> fᅵr das Startdatum die relevante Lᅵnge des Startmonats und nicht willkᅵrlich
> die des Vormonats zum Endedatum als Messlatte. Bitte testen und Fehler
> melden ;-)
Hmm ja, Du weiᅵt ja, mit Formeln hab ich es nicht so. Und daher mᅵchte
ich Dich als Formelexperten mal was fragen:
Kᅵnnte man nicht mit ZINSTERMTAGVA oder sowas die Differenz
ausrechnen? Ich komme da auf keinen grᅵnen Zweig.
Gerade die Finanzmathematik-Routinen mᅵssen oft mit der Differenz
zwischen 2 Daten rechnen, da gehe ich doch mal davon aus das die 100%
richtig rechnen, oder gibt's da bekannte Probleme?
Mᅵsste doch irgendwie gehen, irgend eine Idee wie?
Andreas.
Wie sie es sich gedacht haben, habe ich erkl�rt: Vor-End-Monat ist f�r sie
ma�gebend statt Startmonat. :-) Der Startmonat ist beteiligt, der
Vor-End-Monat nicht (wenn er nicht der Startmonat ist).
Meine L�sung kennt keine falsch-gleichen Ergebnisse, wenn sich das
betrachtete Intervall ver�ndert. Sie verlagert die Problematik dorthin, wo
sie hingeh�rt, n�mlich in die sowieso nicht genau me�bare Einheit "Monat".
> K�nnte man nicht mit ZINSTERMTAGVA oder sowas die Differenz ausrechnen?
> Ich komme da auf keinen gr�nen Zweig.
Finanzmathematik hat wieder eigene Fiktionen, die ich hier einfach mal
ausschlie�e - �brigens wieder mit dem Argument der falsch-gleichen
Ergebnisse bei Intervallver�nderung.