02. oktober 2007 - 14:42
Der er
8 kommentarer og
1 løsning
Præcis dato interval
Hey Experter
Jeg har brug for en præcis angivelse af et dato interval mellem to datoer.
Jeg har følgende kode som jeg arbejder med:
Private Sub Varighed_Enter()
Dim startDato As Date
Dim slutdato As Date
Dim varighedsres As Double
Dim resYear As Integer
Dim resMonth As Integer
Dim resDay As Integer
startDato = Forms!Opret_ophold!Fra_dato
slutdato = Forms!Opret_ophold!Til_dato
varighedsres = DateDiff(interval:="m", Date1:=startDato, Date2:=slutdato)
Forms!Opret_ophold!Varighed = varighedsres
End Sub
Mit problem er at funktionen DateDiff resturnere forskellen mellem to tal i hele tal.
F.eks. forskellen mellem 15-07-1996 og 01-08-1997 er præcist 12,6 måneder, men ved at bruge DateDiff fås 13 måneder.
Hvordan kan jeg ændre min kode, så jeg får resultatet ud præcist, altså på formatet 12,6 måneder?????
Venlig hilsen
duus0710
02. oktober 2007 - 19:44
#5
Her er den løsning som jeg selv er kommet frem til:
Private Sub Varighed_Enter()
Dim startDato As String
Dim slutdato As String
Dim TestDato As String
Dim varighedsres As Integer
Dim dag1 As Integer
Dim dag2 As Integer
Dim PartofMonth As Integer
Dim month As Integer
Dim month2 As Integer
Dim antaldage As Integer
Dim Skudår As Boolean
Dim måned
startDato = Forms!Opret_ophold!Fra_dato
slutdato = Forms!Opret_ophold!Til_dato
month = Val(Mid(startDato, 4, 2))
month2 = Val(Mid(slutdato, 4, 2))
måned = month 'Angivelse af måneden til første gennemkørelse af hver case
Select Case måned
Case 1, 3, 5, 7, 8, 10, 12 'Case hvor antalet af dage i en måned sættes til 31
antaldage = 31
dag1 = Val(Mid(startDato, 1, 2))
Case 4, 6, 9, 11 'Case hvor antalet af dage i en måned sættes til 30
antaldage = 30
dag1 = Val(Mid(startDato, 1, 2))
Case 2 'Case hvor der tages højde for skud år
TestDato1 = "29-02-" & Val(Mid(startDato, 7, 4))
If IsDate(TestDato1) Then
Skudår = True
antaldage = 29
dag1 = Val(Mid(startDato, 1, 2))
Else
Skudår = False
antaldage = 28
dag1 = Val(Mid(startDato, 1, 2))
End If
End Select
måned = month2 'Angivelse af månden til anden gennemkørelse af hver case for datoen slutdato
Select Case måned
Case 1, 3, 5, 7, 8, 10, 12 'Case hvor antalet af dage i en måned sættes til 31
antaldage = 31
dag2 = Val(Mid(slutdato, 1, 2))
Case 4, 6, 9, 11 'Case hvor antalet af dage i en måned sættes til 30
antaldage = 30
dag2 = Val(Mid(slutdato, 1, 2))
Case 2 'Case hvor der tages højde for skud år
TestDato1 = "29-02-" & Val(Mid(slutdato, 7, 4))
If IsDate(TestDato1) Then
Skudår = True
antaldage = 29
dag2 = Val(Mid(slutdato, 1, 2))
Else
Skudår = False
antaldage = 28
dag2 = Val(Mid(slutdato, 1, 2))
End If
End Select
varighedsres = DateDiff(interval:="m", Date1:=CDate(startDato), Date2:=CDate(slutdato)) 'Udregning af antallet af måneder fra startdato til slutdatoen
Forms!Opret_ophold!Varighed = varighedsres + (dag1 / antaldage) + (dag2 / antaldage) 'Angivelse af den samlede tid mellem de to måneder.
End Sub
02. oktober 2007 - 20:29
#8
Så vidt jeg lige kan se, så regner den ikke helt korrekt. Resultatet bliver 1,07 hvis forskellen er præcist én måned.
02. oktober 2007 - 20:43
#9
Nu ved jeg jo ikke, hvad det er du skal bruge det til, men giver det overhovedet nogen mening at skelne mellem om det måneder med 28, 29, 30 eller 31 dage?
For det første er forskellen i virkeligheden ikke ret stor, når man betragter resultatet som måneder med en decimal.
For det andet er det vel ikke rimeligt at sige at f.eks. to personer har brugt lige lang tid på et stykke arbejde, hvis den ene har brugt en måned i februar og den anden en måned i marts. Så vidt jeg lige kan se, så skal det i begge tilfælde give 1,0 måned med din funktion. Men i virkeligheden har den ene brugt 10 procent mere tid på det.