Avatar billede cstern Nybegynder
01. marts 2001 - 11:48 Der er 7 kommentarer og
1 løsning

Beregning af alder (tidsforskel)

Jeg skal bruge en persons alder. Jeg har lavet denne funktion:

Function NumYears(dd As Byte, mm As Byte, yyyy As Integer) As Byte
Dim strTemp As String

strTemp = Str(dd) & \"/\" & Str(mm) & \"/\" & Str(yyyy)
NumYears = Int(DateDiff(\"d\", strTemp, Now) / 365)

End Function

Det fungerer fint, men der vil være enkelte situationer omkring en persons fødselsdag hvor det vil give forkert svar da der ikke er 365, men 365,xxx dage på et år.

Man kan også bruge \"yyyy\" i stedet for \"d\" i DateDiff men det runder konsekvent op, så den antager at det \"Now\" er 31-12-2001 og query datoen er 01-01-XXXX hvor XXXX er året man spørger på (dag og månded bliver med andre ord ignoreret og alderen vil vises som én for høj indtil man kommer forbi fødselsdatoen.

Er der nogen der har et bedre forslag til en års-beregning mellem to datoer? (PS man skal valgfrit kunne anvende andet end \"Now\" som startdato)

Eller alternativt: hvilken konstant skal jeg bruge i stedet for 365 for at få en bedre bergening.
Avatar billede hoejrup Nybegynder
01. marts 2001 - 12:01 #1
Hvert fjerde år er et skudår, så skal du trække antallet af skud dage ud af regnskabet, før du dividere med 365.

/per
Avatar billede cstern Nybegynder
01. marts 2001 - 12:20 #2
hoejrup - var det blot så simpelt... der er mere i det end som så, men jeg kan ikke reglerne uden ad. Det er noget med at hvis året er deleligt med 200 er der enten en ekstra eller en mindre skuddag + der er nogle andre korrigerende faktorer. Så derfor er 365,25 ikke det rigtige svar.
Avatar billede cstern Nybegynder
01. marts 2001 - 12:57 #3
Jeg fandt denne algoritme for skudår:
if (year mod 4 != 0)
                {use 28 for days in February}
            else if  (year mod 400 == 0)
                {use 29 for days in February}
            else if (year mod 100 == 0)
                {use 28 for days in February}
            else
                {use 29 for days in February}

( != betyder det samme som <> i VB)
Avatar billede cstern Nybegynder
01. marts 2001 - 12:59 #4
A year is a leap year if:
(i) It is divisible by 4 but not by 100, or
(ii) It is divisible by 400.

Avatar billede cstern Nybegynder
01. marts 2001 - 13:37 #5
mulighed B må derfor være 1/4 - 1/100 + 1/400 = 0,25 - 0,01 + 0,0025 = 0.2425, eller pr år er der 365,2425 dage.

Så nu er jeg mest/kun interesseret i en alternativ måde at beregne årsdifferencen mellem to datoer (gerne med DateDiff eller andet).
Avatar billede hoejrup Nybegynder
01. marts 2001 - 13:43 #6
cstern> Der er korrekt, men jeg lever ikke så længe. Men det kan være at du bliver over 1000år.

/per
Avatar billede cstern Nybegynder
01. marts 2001 - 13:49 #7
he he - jeg har ikke regnet efter hvor problemet evt kunne opstå,
men pointen er vel at funktionen skal skrives

NumYears = Int(DateDiff(\"d\", strTemp, Now) / 365.2425)

hvis det skal være lidt mere præcist? Det vil selvfølgelig kun give en dags forskel på 400 år sådan cirka i forhold til dit svar.

Under alle omstændigheder er det en klodset løsning og jeg ville hellere have noget der kunne beregne årene direkte uden disse approximationer.

...
Avatar billede cstern Nybegynder
01. marts 2001 - 14:11 #8
Function NumYears(dd As Integer, mm As Integer, yyyy As Integer) As Integer

Dim intCDay As Integer, intCMon As Integer, intCYear As Integer

intCDay = DatePart(\"d\", Now) - dd
intCMon = DatePart(\"m\", Now) - mm
intCYear = DatePart(\"yyyy\", Now) - yyyy

NumYears = intCYear

If intCMon = 0 Then If intCDay < 0 Then NumYears = NumYears - 1
If intCMon < 0 Then NumYears = NumYears - 1

End Function

Primitivt men effektivt...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester