webForumDet fria alternativet

Åldersgräns på bokning

ASP

14 svar · 975 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

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?

Hur löser jag smidigast det här?

Tack!

Medlem sedan juni 20034 013 inlägg
#2

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.

Medlem sedan apr. 20022 743 inlägg
#3

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
Medlem sedan jan. 20022 440 inlägg
#4

Precis som Tydal skriver. Dela upp deras födelsedatum i 3 delar (år, månad, dag)

Sedan jämför du året med lägsta tillåtna sedan månad och sist dag om det skulle behövas.

Medlem sedan feb. 20034 441 inlägg
#5

Okej, vad är det som gör att Poffe's lösning inte är bra, eller rättare sagt, vad gör den andra varianten bättre?

Medlem sedan feb. 20034 441 inlägg
#6

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?

Over and out... :)

Medlem sedan juni 20034 013 inlägg
#7

Min lösning är bra för att den är enkel och exakt. Det är lätt att inse hur den fungerar och att den fungerar som du vill.

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.

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.

Medlem sedan apr. 20022 743 inlägg
#8

tydal skrev:

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?

Medlem sedan jan. 2007177 inlägg
#9

Poffes lösningar använder...

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.

Medlem sedan feb. 20034 441 inlägg
#10

tydal skrev:

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.

Medlem sedan jan. 2007177 inlägg
#11

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

Fungerar inte detta i asp miljö?

Medlem sedan juni 20034 013 inlägg
#12

MickeA.com skrev:

Vissa kanske anger "01" som år, hur ska jag då ta reda på att det inte är "1901" utan "2001" ?

I personnummer så har man ett plustecken mellan födelsedatum och födelsenummer om man är 100 år eller äldre. Är man yngre så har man ett minustecken.

Det bästa är dock att ange årtal med fyra siffror.

Medlem sedan juni 20034 013 inlägg
#13

Poffe skrev:

Men 4 år är väll ändå alltid 1461 dagar, oavsett vilket av åren skottåret infaller?

Nej, för skottår infaller inte vart hundrade år, bara vart fyrhundrade. Så 1900 var inget skottår medan däremot 2000 var det.

Medlem sedan apr. 20022 743 inlägg
#14

tydal skrev:

Nej, för skottår infaller inte vart hundrade år, bara vart fyrhundrade. Så 1900 var inget skottår medan däremot 2000 var det.

Åfan, så skottår är alltså inte alltid var 4:e år. Då har man lärt sig något nytt :)

Dock så borde väll i2n2:s förslag fungera utan att behöva dela upp kontrollen i tre steg.

Medlem sedan juni 200032 967 inlägg
#15

Poffe skrev:

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.

270 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)