Avatar billede th1 Nybegynder
16. januar 2008 - 00:22 Der er 27 kommentarer og
1 løsning

Alder med CPR

Hejsa nogen der kan fortælle hvordan man kan regne alder ud fra et cpr som dette 1234567890 eller 123456-7890 ?
Avatar billede arne_v Ekspert
16. januar 2008 - 00:43 #1
Ciffer 5 og 6 er årstal.

Det må være nemt at extracte dem.

Hvis du har CPR numre for folk der er født før 1908 er der også en måde at se om de
er det.

Skal jeg finde et link til den beskrivelse ?
Avatar billede th1 Nybegynder
16. januar 2008 - 00:58 #2
ja du må du gerne da jeg ved at jeg har ingen som er født før 1908
Avatar billede th1 Nybegynder
16. januar 2008 - 00:59 #3
ups..  altså jeg mener jeg har nogen der født fra 1923 og der op af
Avatar billede arne_v Ekspert
16. januar 2008 - 02:44 #4
Hvis du ikke har nogen over 100 år så er det nemt.

Prøv den her:

CREATE FUNCTION udf_age(@birthday_string CHAR(10)) RETURNS INTEGER
AS
BEGIN
    DECLARE @birthday AS DATETIME
    IF CONVERT(INTEGER, '20' + SUBSTRING(@birthday_string,5,2)) <= YEAR(GETDATE())
        SET @birthday = CONVERT(DATETIME, '20'+SUBSTRING(@birthday_string,5,2)+SUBSTRING(@birthday_string,3,2)+SUBSTRING(@birthday_string,1,2), 112)
    ELSE
        SET @birthday = CONVERT(DATETIME, '19'+SUBSTRING(@birthday_string,5,2)+SUBSTRING(@birthday_string,3,2)+SUBSTRING(@birthday_string,1,2), 112)
    RETURN YEAR(GETDATE())-YEAR(@birthday)-CASE WHEN DATEPART(dy,GETDATE())<DATEPART(dy,@birthday) THEN 1 ELSE 0 END
END
GO
Avatar billede pepsdk Nybegynder
16. januar 2008 - 07:45 #5
Alternativt kan du trække deres FOEDSELSDAG ud som en datetime og gøre noget ala følgende:

  CASE WHEN month([FOEDSELSDAG]) = month(getdate()) then
        case when day([FOEDSELSDAG]) <= day(getdate()) then
            year(getdate()) - year([FOEDSELSDAG])
        else
            year(getdate()) - year([FOEDSELSDAG]) - 1
        end
    WHEN month([FOEDSELSDAG]) > month(getdate()) then
        year(getdate()) - year([FOEDSELSDAG]) - 1
    ELSE
        year(getdate()) - year([FOEDSELSDAG])
    END AS [ALDER]
Avatar billede pierrehusted Nybegynder
16. januar 2008 - 10:03 #6
Jeg plejer at bruge en DateDiff("d", fod_dato, now) / 365.15
Det passer ikke helt 100%, men er ret tæt på. Har prøvet med DateDiff("y"...  men den runder vist altid op eller noget (den kunne i hvert fald ikke bruges sidst jeg eksperimenterede).


Men pepsdks forslag ser også interessant ud. Det vil jeg prøve at sætte ind på nogle af mine sites.
Avatar billede Slettet bruger
16. januar 2008 - 12:47 #7
Avatar billede th1 Nybegynder
16. januar 2008 - 23:57 #8
arne v
jeg har fået din funktion til at virke men det eneste problem er at alle har alderen 19.

Jeg har gjort det på følgende måde:

Select *, dbo.udf_age(SocialID) as age From PhotoStudio_Models
Avatar billede a1a1 Novice
17. januar 2008 - 00:44 #9
btw, th1 du må ikke (bare) gemme cprnr. i en database i.flg. datatilsynet
Avatar billede arne_v Ekspert
17. januar 2008 - 00:48 #10
Kaldet ser rigtig ud, men hvad er data typen for SocialID ?
Avatar billede a1a1 Novice
17. januar 2008 - 00:50 #11
http://www.e-maerket.dk/sw279.asp

Personnummer (cpr-nummer)
En virksomhed må kun behandle dit personnummer, når det følger af lovgivningen eller hvis du udtrykkeligt har givet dit samtykke. Oplysninger om dit personnummer må også videregives, når videregivelsen er et naturligt led i den normale drift og er af afgørende betydning for en entydig identifikation af dig.


Du skal ikke oplyse dit personnummer, hvis ikke det er nødvendigt for virksomheden. - Og det er det f.eks. ikke for en videoudlejningsbutik.

Mange virksomheder vil anvende det som en nøgle og det er en unik måde at kunne samle mange personoplysninger om dig på en let og overskuelig måde.


Da personnummeret åbner for mange personoplysninger er der en høj risiko for, at dine oplysninger kan blive misbrugt. Du skal derfor altid tænke dig om, inden du oplyser dit personnummer.
Avatar billede th1 Nybegynder
17. januar 2008 - 00:51 #12
det har data typen varchar(50)
Avatar billede arne_v Ekspert
17. januar 2008 - 01:27 #13
Jeg kan ikke genskabe problemet.

1> SELECT dbo.udf_age('1601680123')
2> GO

-----------
          40

(1 row affected)

1> DECLARE @s1 CHAR(10)
2> SET @s1 = '1601680123'
3> SELECT dbo.udf_age(@s1)
4> GO

-----------
          40

(1 row affected)

1> DECLARE @s2 VARCHAR(50)
2> SET @s2 = '1601680123'
3> SELECT dbo.udf_age(@s2)
4> GO

-----------
          40

(1 row affected)

Der er ikke nogle leading spaces eller andet i dine værdier ?
Avatar billede a1a1 Novice
17. januar 2008 - 01:29 #14
btw: "datatypen" burde være char(10) (eller (11) hvis du vil have bindestregen med)
240112-1234
Avatar billede a1a1 Novice
17. januar 2008 - 01:39 #15
fandt denne udf (du skal kun sende de første 10 tegn til funktionen=

CREATE FUNCTION GetAge

/*

Version 1.1

This function returns the age of a person, in years, for a given date
of birth.  Due to the limitations placed on using the GETDATE() function
within user-defined functions, todays date also needs to be supplied.

***********Created by Karl Grambow.  karlgrambow@hotmail.com.*************

*/
    (@DateOfBirth datetime, @Today datetime)
RETURNS int
AS
BEGIN

DECLARE @Age int --Age in years.

SET @Age = YEAR(@Today) - YEAR(@DateOfBirth)

IF MONTH(@DateOfBirth) > MONTH(@Today)
  BEGIN
    SET @Age = @Age - 1
  END

IF MONTH(@DateOfBirth) = MONTH(@Today)
  BEGIN
    IF DAY(@DateOfBirth) > DAY(@Today)
          BEGIN
        SET @Age = @Age - 1
        END
  END

RETURN (@Age)

END
Avatar billede a1a1 Novice
17. januar 2008 - 01:41 #16
param @Today datetime kunne/skulle være udeladt, men den skal bare "sættes" til GETDATE()

;O)
Avatar billede a1a1 Novice
17. januar 2008 - 01:45 #17
hvis du har din dato liggende (sender en) som en char, varchar (string) kan den være at du skal converte eller cast'e den til det rigtige format

http://www.google.dk/search?hl=da&q=mssql+cast+date&meta=

http://www.google.dk/search?hl=da&q=mssql+convert+date&meta=
Avatar billede th1 Nybegynder
19. januar 2008 - 17:22 #18
jeg har fundet ud af hvad der er galt..  det fordi at der nogen som har indtastet CPR nr som dette:

0000000000


og det kan den ikke converter.. men så har jeg et spg..

hvordan kan jeg få den function som arne_v har lavet og jeg burger.. til at skippe dem cpr nr som er 0000000000

jeg har prøvet med

IF @birthday_striing = '0000000000'

ELSE

men der kommer en fejl

nogen der ved hvordan jeg kan komme uden om det??
Avatar billede arne_v Ekspert
19. januar 2008 - 19:51 #19
Hvilken fejl ?

(jeg antager at der ikke er "dobbelt i" i den rigtige kode)
Avatar billede th1 Nybegynder
19. januar 2008 - 20:00 #20
nå ja har lavet det om..

men der kommer stadig den samme fej meddelse som er:

Msg 156, Level 15, State 1, Procedure udf_age, Line 6
Incorrect syntax near the keyword 'ELSE'

koden ser sådan her ud nu:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[udf_age](@birthday_string char(11)) RETURNS INTEGER
AS
BEGIN
    IF @birthday_string = '0000000000'

ELSE

   
    DECLARE @birthday AS DATETIME
    IF CONVERT(INTEGER, '20' + SUBSTRING(@birthday_string,5,2)) <= YEAR(GETDATE())
        SET @birthday = CONVERT(DATETIME, '20'+SUBSTRING(@birthday_string,5,2)+SUBSTRING(@birthday_string,3,2)+SUBSTRING(@birthday_string,1,2), 112)
    ELSE
        SET @birthday = CONVERT(DATETIME, '19'+SUBSTRING(@birthday_string,5,2)+SUBSTRING(@birthday_string,3,2)+SUBSTRING(@birthday_string,1,2), 112)
    RETURN YEAR(GETDATE())-YEAR(@birthday)-CASE WHEN DATEPART(dy,GETDATE())<DATEPART(dy,@birthday) THEN 1 ELSE 0 END
END
Avatar billede arne_v Ekspert
19. januar 2008 - 20:13 #21
prøv:

BEGIN
    IF @birthday_string = '0000000000'
        RETURN NULL
    ELSE
Avatar billede th1 Nybegynder
19. januar 2008 - 20:22 #22
når jeg gør det så siger den Incorrect syntax near 'END' som er i sluttningen
Avatar billede arne_v Ekspert
19. januar 2008 - 20:25 #23
der skal nok BEGIN END omkring ELSE blokken:

ELSE
  BEGIN
      ....
  END
END
Avatar billede th1 Nybegynder
19. januar 2008 - 20:26 #24
det virker fint nu..  fik bare lige skrevet to BEGIN efter hinanden  mange tak for din hjælp arne_v  du må gerne ligge et svar så du kan få dine point
Avatar billede arne_v Ekspert
19. januar 2008 - 20:43 #25
svar
Avatar billede th1 Nybegynder
19. januar 2008 - 20:49 #26
kunne ikke bruge dit svar til noget
Avatar billede th1 Nybegynder
19. januar 2008 - 20:49 #27
takker for hjælp
Avatar billede a1a1 Novice
20. januar 2008 - 01:12 #28
;o)

arne... du skal huske END /o) ellers stopper det aldrig ;o))))
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