55 votes

Comment calculer l'âge en T-SQL avec les années, les mois et les jours ?

Quelle serait la meilleure façon de calculer l'âge d'une personne en années, mois et jours en T-SQL (SQL Server 2000) ?

Le site datediff La fonction ne gère pas bien les limites de l'année, et séparer les mois et les jours sera difficile. Je sais que je peux le faire relativement facilement du côté client, mais j'aimerais que ce soit fait dans ma base de données de procédure stockée .

74voto

Dane Points 3595

Voici un T-SQL qui vous donne le nombre d'années, de mois et de jours depuis le jour spécifié dans @date. Il prend en compte le fait que DATEDIFF() calcule la différence sans tenir compte du mois ou du jour (donc la différence de mois entre le 31/8 et le 1er/9 est de 1 mois) et gère cela avec une instruction case qui diminue le résultat lorsque cela est approprié.

DECLARE @date datetime, @tmpdate datetime, @years int, @months int, @days int
SELECT @date = '2/29/04'

SELECT @tmpdate = @date

SELECT @years = DATEDIFF(yy, @tmpdate, GETDATE()) - CASE WHEN (MONTH(@date) > MONTH(GETDATE())) OR (MONTH(@date) = MONTH(GETDATE()) AND DAY(@date) > DAY(GETDATE())) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(yy, @years, @tmpdate)
SELECT @months = DATEDIFF(m, @tmpdate, GETDATE()) - CASE WHEN DAY(@date) > DAY(GETDATE()) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(m, @months, @tmpdate)
SELECT @days = DATEDIFF(d, @tmpdate, GETDATE())

SELECT @years, @months, @days

16voto

tkerwood Points 1030

Essayez ceci...

SELECT CASE WHEN
 (DATEADD(year,DATEDIFF(year, @datestart  ,@dateend) , @datestart) > @dateend)
THEN DATEDIFF(year, @datestart  ,@dateend) -1
ELSE DATEDIFF(year, @datestart  ,@dateend)
END

En fait, "DateDiff( year...", vous donne l'âge que la personne aura cette année, donc j'ai juste ajouté une déclaration de cas pour dire, si elle n'a pas encore eu d'anniversaire cette année, alors soustraire 1 an, sinon retourner la valeur.

13voto

La méthode simple pour obtenir l'âge en tant que texte est la suivante :

Select cast((DATEDIFF(m, date_of_birth, GETDATE())/12) as varchar) + ' Y & ' + 
       cast((DATEDIFF(m, date_of_birth, GETDATE())%12) as varchar) + ' M' as Age

Le format des résultats sera :

**63 Y & 2 M**

4voto

Leonardo Points 1144

Voici une version (légèrement) plus simple :

CREATE PROCEDURE dbo.CalculateAge 
    @dayOfBirth datetime
AS

DECLARE @today datetime, @thisYearBirthDay datetime
DECLARE @years int, @months int, @days int

SELECT @today = GETDATE()

SELECT @thisYearBirthDay = DATEADD(year, DATEDIFF(year, @dayOfBirth, @today), @dayOfBirth)

SELECT @years = DATEDIFF(year, @dayOfBirth, @today) - (CASE WHEN @thisYearBirthDay > @today THEN 1 ELSE 0 END)

SELECT @months = MONTH(@today - @thisYearBirthDay) - 1

SELECT @days = DAY(@today - @thisYearBirthDay) - 1

SELECT @years, @months, @days
GO

3voto

simon831 Points 1322

Le même genre de chose qu'une fonction.

create function [dbo].[Age](@dayOfBirth datetime, @today datetime)
   RETURNS varchar(100)
AS

Begin
DECLARE @thisYearBirthDay datetime
DECLARE @years int, @months int, @days int

set @thisYearBirthDay = DATEADD(year, DATEDIFF(year, @dayOfBirth, @today), @dayOfBirth)
set @years = DATEDIFF(year, @dayOfBirth, @today) - (CASE WHEN @thisYearBirthDay > @today THEN 1 ELSE 0 END)
set @months = MONTH(@today - @thisYearBirthDay) - 1
set @days = DAY(@today - @thisYearBirthDay) - 1

return cast(@years as varchar(2)) + ' years,' + cast(@months as varchar(2)) + ' months,' + cast(@days as varchar(3)) + ' days'
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X