Schaltjahr in Access Abfrage berechnen

Variante A mit DateSerial

Hierbei wird vorausgesetzt, dass es ein Feld [GrundDatum] gibt, aus welchem das Schaltjahr ermittelt werden soll. Das Ergebnis im Ausdruck15 ist der Text «Schaltjahr» oder «kein Schaltjahr».

Ausdr15:Wenn(1+DatSeriell(Jahr([GrundDatum]);12;31)-DatSeriell(Jahr([GrundDatum]);1;1)=366;»Schaltjahr»;»kein Schaltjahr»)

Varuante B mit DatDiff

Es wird die Differenz in Tagen «d» vom 1.1. bis zum 12.31. (mm.dd) berechnet. Ein normales Jahr hat 365 Tage, ein Schaltjahr 366. Wenn also die Differenz + 1 = 366 ist, dann ist es ein Schaltjahr.

Ausdr16: Wenn(DatDiff("d";"1.1." & Jahr([GrundDatum]);("12.31." & Jahr([GrundDatum])))+1=366;"Schaltjahr";"kein Schaltjahr")

Rückgabe der Anzahl Tage für den Monat Februar

 Ausdr17: Wenn(DatDiff("d";"1.1." & Jahr([GrundDatum]);("12.31." & Jahr([GrundDatum])))+1=366;29;28) 

Als VBA Lösung z.B. für Excel

Sub Schaltjahr()
    Dim EinJahr As Variant
    Dim NumJahr As Integer
        
    EinJahr = InputBox("Bitte zu prüfendes Jahr vorgeben!")
    If EinJahr = "" Then
       Exit Sub
    End If
    If Not (IsNumeric(EinJahr)) Then
       MsgBox "Eingabe nicht numerisch!"
       Exit Sub
    End If
    NumJahr = CInt(EinJahr)
    If Not (NumJahr Mod 4) = 0 Then
       MsgBox ("kein Schaltjahr!")
       Exit Sub
    End If
    If (NumJahr Mod 100) = 0 And Not ((NumJahr Mod 400) = 0) Then
       MsgBox ("kein Schaltjahr!")
    Else
       MsgBox ("Schaltjahr!")
    End If
End Sub

Weitere Möglichkeit in VBA

Wir können auch auf den 29. März abfragen. Die Funktion Day(Datum) Liefert True oder False zurück wenn das Datum existiert.

Function schaltjahr(jahr As Integer) As Boolean
   schaltjahr = Day(DateSerial(jahr, 2, 29)) = 29
End Function

Wer misst, misst Mist und wie rechnet Access und Excel?

Prüfen Sie, ob das Jahr 1900 ein Schaltjahr war oder nicht. Gibt es den 29.2.1900?

Hinweis: DateSerial() ist eine serielle Zahl welche mit dem Wert 1 beginnt und für jeden ganzen Tag eins dazu zählt.

Seit der gregorianischen Kalenderreform (1582) sind diejenigen Jahre Schaltjahre die
folgendes erfüllen …
1. jedes durch 4 teilbare Jahr (Jahr Mod 4 = 0: also 1904, 1908, 1912, etc. )
2. nicht jedoch Jahre, die durch 100 teilbar sind (nicht Jahr Mod 100 = 0: 1800, 1900)
3. aber doch Jahre die durch 400 teilbar sind (Jahr Mod 400 = 0: 1600, 2000, 2400, etc.)
Volle Jahrhunderte sind kein Schaltjahr, es sei denn sie sind durch 400 teilbar.
Deshalb war 1900 kein Schaltjahr, 2000 aber doch!
Microsoft hat in der 1. Excel-Version irrtümlich den 29.02.1900 integriert und in den folgenden Versionen aus Kompatibilitätsgründen nie eliminiert!

Ergo

Function SchaltJahr(Jahr As Integer) As Boolean
' Falsch = Jahr ist kein Schaltjahr , Warh = Jahr ist ein Schaltjahr
    SchaltJahr = Jahr Mod 4 = 0 And (Jahr Mod 100 <> 0 Or Jahr Mod 400 = 0)
End Function

Diese Funktion mit Mod kann auch in die obige Access Abfrage eingebaut werden um das Schaltjahr oder die Anzahl Tage im Februar zu ermitteln.