Avatar billede meretenj Nybegynder
30. juni 2005 - 16:28 Der er 9 kommentarer og
1 løsning

Udfra feltet cprnr søges alle der dd. har en bestemt alder

Hej!
Jeg har en tabel der inderholder cprnr. udfra dette felt skal jeg finde alle dem der dagsdato er yngre end en bestemt angivet alder, fx. 50 år.

Kan man lave en sql der kan udsøge dette?
Avatar billede Slettet bruger
30. juni 2005 - 18:16 #1
Du kan ikke regne med at lave det direkte, men hvis du er på MS SQL 2000 (sp3) eller derover kan du lave en brugerdefineret funktion som regner alderen ud på baggrund af et cprnr. På den måde bliver det muligt for dig at anvende den i "almindelige" sql-statements som eksempelvis select * from medarbejdere where alderFraCpr(cprnr-kolonne) < 50 og ligende udtryk.

Problemet er at det at beregne alderen fra et cprnr ikke er ligefrem du skal huske at tage højde for hvilket århunderer, derfor ville det være en fordel for dig at hvad en proceduralt-sprog som t-sql til at definere funktionen.

Dokumentation : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_create_7r1l.asp
Avatar billede runesoft Nybegynder
03. juli 2005 - 20:54 #2
kryptos-> Istedet for at lave en funktion der bliver udført på alle rækker i tabellen, er det smartere at lave en funktion der kan regne 50 om til cpr format. Det gør det muligt at indeksere cpr nummer kollonen.
Avatar billede Slettet bruger
04. juli 2005 - 13:14 #3
Godt set, runesoft :) vi skal altså have noget som minder om nedenstående :

select * from medarbejdere where cprnr_kolonne < cprFraAlder || '%'  -- Ikke sikker på om || er string concat i MSSQL

pas dog på <= i giver fald skal du nok lægge en til alder.
Avatar billede Slettet bruger
04. juli 2005 - 13:15 #4
ja, og så skal det hele med :

select * from medarbejdere where cprnr_kolonne < cprFraAlder(50) || '%'  -- Ikke sikker på om || er string concat i MSSQL
Avatar billede beef12 Nybegynder
08. juli 2005 - 08:43 #5
man bruger bare + til concat
Avatar billede beef12 Nybegynder
08. juli 2005 - 09:04 #6
Jeg går ud fra at cpr_nr feltet er et varchar felt, da det typisk udformes f.eks. 121250-2322

Dette virker:
where
datediff(yy,cast(left(cpr,2)+'-'+right(left(cpr,4),2)+'-'+right(left(cpr,6),2) as datetime),getdate()) < 50
Avatar billede beef12 Nybegynder
08. juli 2005 - 09:07 #7
grunden til at jeg nævnte det med varchar-typen er at går stækt ud fra kryptos kode vil fejle da der anvendes en sammenlignings operator på en varchar kollone. Ret mig hvis jeg tager fejl
Avatar billede meretenj Nybegynder
08. juli 2005 - 09:14 #8
tak for svaret til beef12, det virker!
Avatar billede meretenj Nybegynder
08. juli 2005 - 09:16 #9
Jeg vil gerne give dig point beef12, men jeg er vist for dum til at finde ud af hvordan jeg gør det?????
Avatar billede beef12 Nybegynder
09. juli 2005 - 13:29 #10
Det er fordi jeg ikke lagt et svar. Det gør jeg så nu :-)

I menuen til venstre vil du nu se mit navn, som du kan markere og vælge accepter svar eller noget i den dur.
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
Computerworld tilbyder specialiserede kurser i database-management

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