Avatar billede steensommer Praktikant
24. januar 2011 - 13:34 Der er 16 kommentarer og
1 løsning

Beregning af alder

Hej

Jeg har følgende presserende problem i en SQL database (Kartotek):

Jeg skal beregne alder som forskellen mellem de 6 første cifre i feltet: [Cpr nr] og [Operations dato]. Den første er dim'et nvarchar og den anden datetime.

Hvordan skal SQL koden se ud a la:

Datediff (year, left([Cpr nr], 6), [Operations dato]) ...hvilket ikke virker idet den skal CASTES hmmm!

vh Steen
Avatar billede mcb2001 Nybegynder
24. januar 2011 - 14:27 #1
Det du skal bruge finder du her:
http://msdn.microsoft.com/en-us/library/ms187928.aspx

Du skal først finde et format der kan bruges (eller klippe de 6 cifre sammen til et format der kan bruges) og så bruge CONVERT(datetime, @datostreng, #formatnummer)
Avatar billede steensommer Praktikant
24. januar 2011 - 14:29 #2
Jeg har prøvet forskellige CAST og CONVERT uden succes- Kan du indsætte det jeg skrev i en convert sætning der fungerer?
Avatar billede mcb2001 Nybegynder
24. januar 2011 - 14:37 #3
Datediff (year,

CONVERT(datetime, substring(@test, 3, 2) + '-' + substring(@test, 0, 3) + '-' + substring(@test, 5, 2), 10)

, [Operations dato])
Avatar billede mcb2001 Nybegynder
24. januar 2011 - 14:38 #4
Datediff (year,

CONVERT(datetime, substring([Cpr nr], 3, 2) + '-' + substring([Cpr nr], 0, 3) + '-' + substring([Cpr nr], 5, 2), 10)

, [Operations dato])




nu med [Cpr nr] istedet for @test (ja, jeg har testet koden)
Avatar billede steensommer Praktikant
24. januar 2011 - 14:55 #5
Det burde vel fungere :-) og gør det også de fleste gange men der fremkommer også nogle NEGATIVE værdier selvom [Operations dato] og [Cpr nr] er korrekte ...mystisk!!!
Avatar billede steensommer Praktikant
24. januar 2011 - 15:00 #6
Det ser faktisk ud til at alle over 60 år får negative værdier !
Avatar billede steensommer Praktikant
24. januar 2011 - 15:03 #7
Og personens rigtige alder = (100 - det negative tal)
Avatar billede mcb2001 Nybegynder
24. januar 2011 - 15:06 #8
ja, den laver dem om til 2043 istedet for 1943...
Løs det ved at ligge 100 til alle værdier og lav så MOD eller % 100
Avatar billede steensommer Praktikant
24. januar 2011 - 15:13 #9
Den afrunder desværre også alderen OPAD :-/
Avatar billede Syska Mester
24. januar 2011 - 22:41 #10
Men fejlen kommer nok pga man bruger year delen.

Du skal nok have diff i måneder ... og ud fra den regne ud hvor gamle de er ...

født år aug 2000
d.d 2011 jan ... det gør dem ikke 11 år, men 10 år og 8 måneder.

Bruger du måneder, kan du dividere med 12:
SELECT (10 * 12 + 8) / 12 -- som giver 10.

håber det giver mening.

mvh
Avatar billede steensommer Praktikant
25. januar 2011 - 15:49 #11
Det giver bestemt mening og løser jo nævnte problem. Der resterer dog fortsat problemet med de negative tal. Jeg vil lige prøve det mcb2001 foreslog :-)
Avatar billede mcb2001 Nybegynder
25. januar 2011 - 16:03 #12
Den her tager højde for de problemer du har med om fødselsdagen har været der eller ej:

declare @dato datetime;
declare @nu datetime;
declare @temp datetime;
declare @age int;

set @dato = '2000-01-02 00:00:00.000';
set @nu = '2011-08-01 00:00:00.000';
set @age = DATEDIFF(YEAR, @dato, @nu);
set @temp = DATEADD(year, @age, @dato);

IF DATEDIFF(day, @temp, @nu) > 0
    select @age
ELSE
    select (@age - 1)
Avatar billede steensommer Praktikant
25. januar 2011 - 16:24 #13
Ovenstående kan vist ikke bruges i Microsoft SQL Server Management Studio hvor jeg forsøger at beregne alder ud fra de 2 felter:

Dette er den tidligere kode indsat (som afrunder og har negative værdier):

SELECT    [CPR nr], [Operations dato], DATEDIFF(year, CONVERT(datetime, SUBSTRING([CPR nr], 3, 2) + '-' + SUBSTRING([CPR nr], 0, 3) + '-' + SUBSTRING([CPR nr], 5, 2), 10),                    [Operations dato]) AS Expr1
FROM        [Kartotek - Kopi]
WHERE    (LEFT([Patient nr], 3) = 'R08')
Avatar billede steensommer Praktikant
25. januar 2011 - 16:26 #14
Med måneder:

SELECT    [CPR nr], [Operations dato], (DATEDIFF(month, CONVERT(datetime, SUBSTRING([CPR nr], 3, 2) + '-' + SUBSTRING([CPR nr], 0, 3) + '-' + SUBSTRING([CPR nr], 5, 2), 10)/12,                [Operations dato]) AS Expr1
FROM        [Kartotek - Kopi]
WHERE    (LEFT([Patient nr], 3) = 'R08')
Avatar billede mcb2001 Nybegynder
25. januar 2011 - 16:28 #15
ja, men med måneder kan du stadig regne forkert :-/ hvis du idag har d. 1/3 og dit cpr er 25/3, så er der et helt antal (deleligt med 12) antal måneder, selv om der er 24 dage til fødselsdagen.

Den kode jeg indsatte vil kun fungere i en stored procedure, men er faktisk testet i sql server management studio.
Avatar billede steensommer Praktikant
25. januar 2011 - 23:21 #16
Du har da sikkert ret MEN mit kendskab til Stored Procedures er lig 0 ...hmmm hvordan skal den anvendes?
Avatar billede steensommer Praktikant
16. marts 2011 - 10:49 #17
Svar
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