Der Umgang mit dem Datentyp Date wird von vielen meistens sehr leichtfertig gehandhabt, deshalb möchte ich hier mal auf etwas hinweisen:
Option Explicit
Public Sub Demo_BestPractice()
Dim dtm As Date
' dtm = DateSerial(2024, 9, 5) ' #9/5/2024#
' dtm = DateSerial(2024, 9, 5) + TimeSerial(14, 30, 0) ' #9/5/2024 2:30:00 PM#
' dtm = TimeSerial(14, 30, 0) ' #2:30:00 PM#
Debug.Print "[Bad Practice]"
dtm = #9/5/2024# + 5
Debug.Print "Date-only:"; Tab(14); dtm
dtm = #9/5/2024 2:30:00 PM# + 5
Debug.Print "DateTime: "; Tab(14); dtm
dtm = #2:30:00 PM# + 5 ' !! potential issue
Debug.Print "Time-only: "; Tab(14); dtm
Debug.Print
Debug.Print "[Better/Best Practice]"
dtm = DateAdd("d", 5, #9/5/2024#)
Debug.Print "Date-only:"; Tab(14); dtm
dtm = DateAdd("d", 5, #9/5/2024 2:30:00 PM#)
Debug.Print "DateTime: "; Tab(14); dtm
dtm = DateAdd("h", 5, #2:30:00 PM#) ' !! clearly defiend -> ok
Debug.Print "Time-only: "; Tab(14); dtm
End Sub
Der Datentyp Date kann entweder ein reines Datum darstellen, ein Datum mit Zeitangabe, oder nur eine reine Zeitanagabe. Addiert man zu diesem einen numerischen Wert, dann findet eine automatische Typ-Konvertierung statt, an derem Ende dann per Definition der Wert als Tage (der ganzzahlige Anteil) interpretiert wird. Soweit ok. Einfach so zu addieren kann bei reinen Zeitangaben jedoch ein Problem werden. Entweder weiß man das vom Kontext her, oder man sollte es vorher zumindest mal mit - zum Beispiel - DateValue() geprüft haben. Allgemein würde ich Neulingen immer zu DateAdd() raten, denn damit ist es eindeutig was man mit der Codezeile gemeint ist.
[Bad Practice]
Date-only: 10.09.2024
DateTime: 10.09.2024 14:30:00
Time-only: 04.01.1900 14:30:00 ' !! falsch
[Better/Best Practice]
Date-only: 10.09.2024
DateTime: 10.09.2024 14:30:00
Time-only: 19:30:00 ' ok, wie beabsichtigt
Wenn man genau weiß, was man tut, kann man von mir aus den leichtfertigen Weg gehen, aber jemanden dies direkt als Lösung oder als Ratschlag zu präsentieren, finde ich nicht in Ordnung.
Grüße
PS: So etwas wie DateSubstract() gibt es nicht, weil dies DateAdd() mit negativen Wert mit abdeckt.
|