2008-11-12 8 views
8

Dans une base de données SQL Server, j'inscris la date de naissance des personnes. Existe-t-il une méthode simple pour déterminer l'âge de la personne à une date donnée en utilisant SQL uniquement?Recherche de l'âge de quelqu'un dans SQL

L'utilisation de DATEDIFF (YEAR, DateOfBirth, GETDATE()) ne fonctionne pas car cela ne concerne que la partie année de la date. Par exemple DATEDIFF (AN, '31 Décembre 2007' , '01 Janvier 2008') refoulements 1.

Répondre

21

Vérifiez cet article: How to calculate age of a person using SQL codes

Voici le code de l'article:

DECLARE @BirthDate DATETIME 
DECLARE @CurrentDate DATETIME 

SELECT @CurrentDate = '20070210', @BirthDate = '19790519' 

SELECT DATEDIFF(YY, @BirthDate, @CurrentDate) - CASE WHEN((MONTH(@BirthDate)*100 + DAY(@BirthDate)) > (MONTH(@CurrentDate)*100 + DAY(@CurrentDate))) THEN 1 ELSE 0 END 
+2

Pourriez-vous réellement mettre le code pertinent dans votre réponse? Les liens vers d'autres sites web peuvent (et sont) cassés, et à l'avenir cette réponse ne sera peut-être pas utile si le lien ne fonctionne plus. –

+0

@Tim C +1 pour suggérer l'ajout de code puisque le site est actuellement en panne et cette réponse aurait été inutile avec seulement un lien. –

5

Il y a une autre façon qui est un peu plus simple:

Select CAST(DATEDIFF(hh, [birthdate], GETDATE())/8766 AS int) AS Age 

Parce que l'arrondi ici est très granulaire, c'est presque parfaitement précis. Les exceptions sont si alambiquées qu'elles sont presque humoristiques: tous les quatre ans, l'âge retourné sera d'un an trop jeune si nous demandons l'âge avant 6h00, B) à l'anniversaire de la personne et C) leur anniversaire est après 28 février. Dans mon contexte, c'est un compromis parfaitement acceptable.

+0

Si vous remplacez GETDATE() par une valeur statique, vous frapperez l'exception plus souvent puisque vous vérifiez à minuit. On dirait que vérifier à partir de midi plutôt que minuit fonctionnerait. – Guvante

2

FWIW, l'âge peut être calculé de façon simple sans avoir recours à hacks (pas qu'il n'y a rien de mal avec hacks!):

CREATE FUNCTION Age (@BirthDate DATETIME) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @AgeOnBirthdayThisYear INT 
    DECLARE @BirthdayThisYear DATETIME 
    SET @AgeOnBirthdayThisYear = DATEDIFF(year, @BirthDate, GETDATE()) 
    SET @BirthdayThisYear = DATEADD(year, @AgeOnBirthdayThisYear, @BirthDate) 
    RETURN 
     @AgeOnBirthdayThisYear 
     - CASE WHEN @BirthdayThisYear > GETDATE() THEN 1 ELSE 0 END 
END 
1

Ce spectacle de solution comment dans une requête sans variables

SELECT DATEDIFF(YY, birthdate, GETDATE()) - CASE WHEN((MONTH(birthdate)*100 + DAY(birthdate)) > (MONTH(GETDATE())*100 + DAY(GETDATE()))) THEN 1 ELSE 0 END 
1

Ceci est plus concis et un peu plus rapide que les réponses fournies, et tout à fait exact:

datediff(year,DateOfBirth,getdate()-datepart(dy,DateOfBirth)+1) 
+0

Cette méthode ne fonctionne pas lorsque GetDate() est la date de naissance. Voici un exemple où la personne devrait avoir 40 ans mais elle n'en renvoie que 39. 'SELECT datediff (year, '1/29/1973', CAST ('1/29/2013' AS DATETIME) -datepart (dy, '1/29/1973 ')) ' –

+0

Merci! Fixé. ------- – brianary

0

J'espère que celui-ci est parfait à condition que vous acceptiez l'algorithme selon lequel un bébé bondira d'un an de plus les 29 février, soit le 1er mars, les années non bissextiles. @DOB doit contenir une date dans quelques siècles maintenant, @AsOf doit contenir une date similaire> = @DOB:

SET @Age = YEAR(@AsOf) - YEAR(@DOB) - 1 
IF MONTH(@AsOf) * 100 + DAY(@AsOf) >= MONTH(@DOB) * 100 + DAY(@DOB) 
    SET @Age = @Age + 1 

Je voudrais vraiment vraiment apprécier tous les tests et les commentaires que je ne l'ai pas trouvé un moyen encore pour le casser ... encore.

Ajouté - 31/01/2014: Celui-ci semble fonctionner parfaitement aussi, même si, à première vue, il semble trop grossière:

SET @Age = FLOOR(DATEDIFF(dd,@DOB,@CompareDate)/365.25) 

Pop ces derniers dans une fonction et est ici un script de test:

SELECT dbo.fnGetAge('2/27/2008', '2/27/2012') 
    SELECT dbo.fnGetAge('2/27/2008', '2/28/2012') 
    SELECT dbo.fnGetAge('2/27/2008', '2/29/2012') 
    SELECT dbo.fnGetAge('2/27/2008', '3/1/2012') 
    -- 4 4 4 4 
    SELECT dbo.fnGetAge('2/28/2008', '2/27/2012') 
    SELECT dbo.fnGetAge('2/28/2008', '2/28/2012') 
    SELECT dbo.fnGetAge('2/28/2008', '2/29/2012') 
    SELECT dbo.fnGetAge('2/28/2008', '3/1/2012') 
    -- 3 4 4 4 
    SELECT dbo.fnGetAge('2/29/2008', '2/27/2012') 
    SELECT dbo.fnGetAge('2/29/2008', '2/28/2012') 
    SELECT dbo.fnGetAge('2/29/2008', '2/29/2012') 
    SELECT dbo.fnGetAge('2/29/2008', '3/1/2012') 
    -- 3 3 4 4 
    SELECT dbo.fnGetAge('3/1/2008', '2/27/2012') 
    SELECT dbo.fnGetAge('3/1/2008', '2/28/2012') 
    SELECT dbo.fnGetAge('3/1/2008', '2/29/2012') 
    SELECT dbo.fnGetAge('3/1/2008', '3/1/2012') 
    -- 3 3 3 4 
    SELECT dbo.fnGetAge('3/1/2007', '2/27/2012') 
    SELECT dbo.fnGetAge('3/1/2007', '2/28/2012') 
    SELECT dbo.fnGetAge('3/1/2007', '2/29/2012') 
    SELECT dbo.fnGetAge('3/1/2007', '3/1/2012') 
    -- 4 4 4 5 
    SELECT dbo.fnGetAge('3/1/2007', '2/27/2013') 
    SELECT dbo.fnGetAge('3/1/2007', '2/28/2013') 
    SELECT dbo.fnGetAge('3/1/2007', '3/1/2013') 
    SELECT dbo.fnGetAge('2/27/2007', '2/28/2013') 
    SELECT dbo.fnGetAge('2/28/2007', '2/28/2014') 
    -- 5 5 6 6 7 

Vive

PS: Vous pouvez probablement modifier la décision 29 Février d'être un jour plus tôt si votre bateau qui flotte.

0
SELECT Pname, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age 
FROM tablename 
+0

une petite explication peut aller un long chemin – davejal