Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Datumsdifferenz nach Jahr, Monat und Tag

Begonnen von Pergus, April 13, 2011, 00:47:27

⏪ vorheriges - nächstes ⏩

Pergus

Hallo Access-O-Maniacs!

Habe ein kleines Denkspiel für Euch, folgende Situation:

Im Formular 'frmMitglieder' gibt es ein Textfeld 'Eintrittsdatum' und ein Textfeld 'Austrittsdatum'.
Nun soll in drei ungebundene Textfelder ('SeitJahre' , 'SeitMonate' und 'SeitTage') der Zeitraum so errechnet werden:

z.B.
Ausgehend davon, dass heute der 13.04.2011 ist:

Mitglied         Eintrittsdatum  SeitJahre   SeitMonate   SeitTage
------------------------------------------------------------------------------
Hans Wurst  23.04.2004       6                11                21
Frank Heiß    12.08.2010       0                8                  1
Fritz Lump    10.03.2000       11              1                  3
usw.

Wie lauten die Formeln, die im Steuerelementinhalt der Textfelder 'SeitJahre' , 'SeitMonate' und 'SeitTage' einzugeben sind?

Aber Vorsicht, wenn ein Monat z.B. 31 Tage hat, dann sollen 'SeitMonate' = 1 und 'SeitTage' = 0 herauskommen,
ebenso, da ein Jahr 12 Monate hat, dann soll 'SeitJahre' = 1 und 'SeitMonate' = 0 ergeben!
Diese müssen selbstverständlich hochgerechnet werden (denn Mitglieder bleiben ja gerne länger als 1 Jahr in einem Verein  ;D )

Wer traut sich ran an diese Aufgabe?

Natürlich lässt sich diese Problematik auch mir Code lösen, aber wie  ???

Sende Euch inzwischen freundliche Grüße

Pergus
Win7, Office Professional 2010

edgar.basler

Ist nicht ganz trivial. Ich habe dies in einer Abfrage wie folgt gelöst:

Jahre: Wenn(Monat([eintrittsdatum])<Monat([austrittsdatum]);Jahr([austrittsdatum])-Jahr([eintrittsdatum]);Wenn(Monat([eintrittsdatum])=Monat([austrittsdatum]);Wenn(Tag([eintrittsdatum])>Tag([austrittsdatum]);Jahr([austrittsdatum])-Jahr([eintrittsdatum])-1;Jahr([austrittsdatum])-Jahr([eintrittsdatum]));Jahr([austrittsdatum])-Jahr([eintrittsdatum])-1))


Monate: Wenn(Monat([eintrittsdatum])<Monat([austrittsdatum]);Monat([austrittsdatum])-Monat([eintrittsdatum]);Wenn(Monat([eintrittsdatum])=Monat([austrittsdatum]);Wenn(Tag([eintrittsdatum])>Tag([austrittsdatum]);Monat([austrittsdatum])-Monat([eintrittsdatum])-1+12;Monat([austrittsdatum])-Monat([eintrittsdatum]));Monat([austrittsdatum])-Monat([eintrittsdatum])+12))

Tage: Wenn(Tag([eintrittsdatum])<Tag([austrittsdatum]);Tag([austrittsdatum])-Tag([eintrittsdatum]);Tag([austrittsdatum])-Tag([eintrittsdatum])+Tag(DatSeriell(Jahr([eintrittsdatum]);Monat([eintrittsdatum]);0)))

database

Hallo Gustav,

nach der hervorragenden Vorarbeit von Edgar war das Beispiel im Anhang relativ schnell realisiert.
Ein einfaches Formular zeigt die von dir gewünschten Werte entweder auf Buttonklick beim Eingeben neuer Daten
oder beim Datensatzwechsel in den entsprechenden Textfeldern an.

HTH

[Anhang gelöscht durch Administrator]

Josef P.

#3
Hallo!

Eine andere Variante:
Steuerelementinhalt von:
txtJahre: =DatDiff("jjjj";[Eintrittsdatum];[Austrittsdatum])+([Eintrittsdatum]>DatAdd("jjjj";-Jahr([Austrittsdatum])+Jahr([Eintrittsdatum]);[Austrittsdatum]))
txtMonate: =DatDiff("m";DatAdd("jjjj";[txtJahre];[Eintrittsdatum]);[Austrittsdatum])+(DatSeriell(Jahr([Austrittsdatum]);Monat([Austrittsdatum]);Tag([Eintrittsdatum]))>[Austrittsdatum])
txtTage: =DatDiff("t";DatAdd("m";[txtMonate];DatAdd("jjjj";[txtJahre];[Eintrittsdatum]));[Austrittsdatum])


Interessehalber:
@database: Warum verwendest du für die Berechnung den Umweg über ein Recordset?
Wäre es nicht übersichtlicher in VBA zu bleiben, wenn die Datumswerte bereits per Parameter übergeben werden?

In VBA würde ich dazu neigen, eine allgemeingültige Prozedur zu erstellen und z. B. einen benutzerdefinierten Typ als Rückgabe verwenden.
In einem allgemeinen Modul:
Public Type DatumsDifferenz
  Jahre As Long
  Monate As Long
  Tage As Long
End Type

Public Function GetDatumsdifferenz(ByVal Date1 As Date, ByVal Date2 As Date) As DatumsDifferenz

  Dim Diff As DatumsDifferenz
  Dim tempDate As Date

  Diff.Jahre = DateDiff("yyyy", Date1, Date2) + (DateAdd("yyyy", Year(Date2) - Year(Date1), Date1) > Date2)

  tempDate = DateAdd("yyyy", Diff.Jahre, Date1)
  Diff.Monate = DateDiff("m", tempDate, Date2) + (DateSerial(Year(Date2), Month(Date2), Day(Date1)) > Date2)

  tempDate = DateAdd("m", Diff.Monate, tempDate)
  Diff.Tage = DateDiff("d", tempDate, Date2)

  GetDatumsdifferenz = Diff

End Function


Im Formular:
Private Sub cmdRechne_Click()
  BerechneDatumsdifferenz
End Sub

Private Sub Form_Current()
  BerechneDatumsdifferenz
End Sub

Private Sub BerechneDatumsdifferenz()

  Dim Diff As DatumsDifferenz

  If IsNull(Me!Eintrittsdatum) Or IsNull(Me!Austrittsdatum) Then
     Me.txtJahre.Value = "N/A"
     Me.txtMonate.Value = "N/A"
     Me.txtTage.Value = "N/A"
     Exit Sub
  End If

  Diff = GetDatumsdifferenz(Me!Eintrittsdatum, Me!Austrittsdatum)
  Me.txtJahre.Value = Diff.Jahre
  Me.txtMonate.Value = Diff.Monate
  Me.txtTage.Value = Diff.Tage

End Sub


/edit: zu überlegen wäre noch, was passieren soll, wenn Date1 > Date2 ist.

mfg
Josef, der hofft, dass in Beitrag #1 keine Hausübung delegiert wurde. :D

database

Hallo,

@Josef
Nein, das war mit Sicherheit keine Hausaufgabe  ;D

ZitatWarum verwendest du für die Berechnung den Umweg über ein Recordset
Hmmm...  viele Wege führen nach Rom...
Nachdem die Abfragendefinition von Edgar schon da war lag dieser Weg am Nächsten - deshalb

Pergus

Hallo edgar.basler,
hallo database (Peter),
hallo Josef P.!

Danke für Euer Mitmachen! Werde alle Lösungen ausprobieren und berichten!
Muß schon sagen, hätte nicht gedacht so schnell und so viele Lösungen zu bekommen!
Aber das bekräftigt meine Aussage, das ACCESS-O-MANIA´s einfach DIE BESTEN  8) sind!

Schöne Grüße aus Südtirol

Gustav
Win7, Office Professional 2010

Pergus

Hallo edgar.basler,

habe Deine Abfrage-Lösung getestet:  1A 8)

Gebe ehrlich zu: Hatte immer schon Verständnis-Schwierigkeiten mit der Logik, wie Microsoft mit dem Datum-Uhrzeit-Format rechnet!
Deine Lösung verschafft mir (und sich auch Anderen!) einen guten Einblick, wie man mit Datums-Formaten umgeht!

Danke dafür!

Gustav
Win7, Office Professional 2010

Pergus

#7
Hallo Peter!

Wie immer funktioniert Deine Lösung einwandfrei (wie könnte es auch anders sein  ;D )

Bin immer froh, wenn zwischen den Antworten auch eine von Dir kommt denn, wie Du weißt, schätze ich Deine Meinung sehr!  ;)

P.S.: Sehe gerade, daß mit dem speichern dieser Antwort mein Status von 'Newbie' auf 'Access-User' geändert wurde!  ::)
       Habe das allermeiste Erlernte Dir zu Verdanken, bin Dir sehr dankbar dafür!

Schöne Grüße

Gustav
Win7, Office Professional 2010

Pergus

Hallo Josef P. !

Auch Deine Lösung ist Tip-Top!

Hatte keine Ahnung, wie ich es bewerkstelligen konnte, und nun habe ich die Qual der Wahl!

Ihr seit wirklich großartig!  ;)

Schöne Grüße aus Südtirol

Gustav
Win7, Office Professional 2010