Tjena,
Jag utför på en hemsida en ålderskontroll, där personer som inte fyllt fyra år ska "blockeras".
Nu har jag sökt runt här i forumet och hittat en del saker för att räkna ut en viss ålder.
Men i det här fallet behövs det något mer, om man tar dagens datum som exempel, ska personer som är födda _innan_ (och inkl.) 2003-11-11 kunna anmälda sig, men någon som är född 2003-12-01 ska blockeras, eftersom denna inte fyllt 4 ännu.
Såhär har jag gjort:
'# age_format är ett personnummer i formen 'yy-mm-dd'
age_format = Mid(sec_number_a, 1, 2) & "-" & Mid(sec_number_a, 3, 2) & "-" & Mid(sec_number_a, 5, 2)
If Int(DateDiff("d",age_format,Date()) / 365.25) < 4 Then
'# Stopp!
Else
'# Fortsätt
End If
Problemet här är att den går på hela år, så att man måste vara född tidigare än -03 för att det här ska "funka".
Jag behöver ut hur många dagar 4 år är, ta det minus dagens datum och sen se när personen är född, eller hur?
Smidigast tycker jag är att tänka på hur man skulle ha löst i huvudet, alltså utan dator...
Hur gör du själv för att kolla om någon är yngre är 4 år?
Jo, du tittar ju på årtalet först. Är det 2004, 2005, 2006 eller 2007 så behöver du ju inte kolla något mer, för då vet du ju.
Likaså om årtalet är 2002 eller äldre, då behöver du ju heller inte kolla mer...
Det är bara om det är 2003 som du måste göra en ytterligare koll. Då börjar du att titta på månaden. Är det något annat än november så vet du. Är det november får du även kolla datumet.
Int avrundar väll om jag inte minns helt fel till närmaste heltal. I ditt exempel så blir ju summan av din uträkning runt 3,91... vilket alltså avrundas till 4. Testa att byta ut Int mot CDbl så borde det fungera eftersom du då får med decimalerna.
If [b]CDbl[/b](DateDiff("d",age_format,Date()) / 365.25) [b]<[/b] 4 Then
'# Stopp!
Else
'# Fortsätt
End If
Eller helt enkelt skriva in antalet dagar direkt, vilket jag tycker verkar enklast:
If DateDiff("d",age_format,Date()) [b]<[/b] 1461 Then
'# Stopp!
Else
'# Fortsätt
End If
Okej, nu har valt varianten som Tydal först nämnde, tänkte nog sätta ihop en funktion av det, som ger true resp. false i retur.
Personnumret anger man i formatet yymmdd-nnnn.
Finns det något smidigt sätt att till att börja med kontrollera året? Datepart("yyyy", Date()) ger ju året i formatet yyyy, finns det något sätt att få året som yy (tex. 03,eller 94) så att det går att räkna ut det här på ett bra sätt?
Poffes lösningar använder avrundade värden (365,25 och 1461) och med avrundade värden får man ett ungefärligt svar, med en viss felmarginal.
Nja, handlar det om 4 år så är det väll 1461 dagar. Så det borde ju bli ganska exakt. Men handlar det om 3 år eller 6 år eller liknande kan det ju bli fel om man inte tar med i beräkningen när skottåret är. Men 4 år är väll ändå alltid 1461 dagar, oavsett vilket av åren skottåret infaller?
Eftersom jag är amatör (har inte skrivit en rad asp kod) så föreslå jag en If-sats enligt principen
If DateDiff("d",age_format, DateAdd("yyyy",4,Date())) < 0 Then
'# Stopp!
Else
'# Fortsätt
End If
då använder man den underliggande DateAdd (som enligt min tolkning av manualen hanterar skottår, dvs är det proffs som jag lutar mig mot för att få korrekt datumberäkning) och som är generaliserbar så att 4 kan ersättas med ett godtyckligt antal år.
Utan att kunna asp skulle jag gissa att Datepart("yy", Date()) kanske ger året med två siffror. Annars är det ju bara att du drar bort 2000.
Nepps, just det som är problemet :)
Det finns inte "yy" i ASP, så jag måste komma på ett bra sätt att lösa det här.
Vissa kanske anger "01" som år, hur ska jag då ta reda på att det inte är "1901" utan "2001" ?
Kanske ett dumt exempel, men det här måste funka, det får inte finnas utrymmet för missar i just det här steget.
Ursäkta, logiskt fel av mig i tidigare inlägg eftersom jag bara tänkte i principer och inte inte använder asp så att jag kan testa. 4 år skall naturligtvis läggas till age_format (födelsedatum) och detta datum skall jämföras med dagens datum. Så den otestade principlösningen blir
If DateDiff("d",Date(), DateAdd("yyyy",4,age_format)) < 0 Then
'# Stopp!
Else
'# Fortsätt
End If
Dock så borde väll i2n2:s förslag fungera utan att behöva dela upp kontrollen i tre steg.
Ja, den ser ut att fungera bra, så länge du ser till att age_format är ett giltigt datum av datumtyp. Se till att subtypskonvertera alltså, så blir det nog bra.
258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e