Le champ de date que je dois calculer l'âge sur est J'ai essayé ci-dessous et converti yyyymmdd code>. getDate code> à yyyymmdd code> au format mais ne semble pas sembler avoir l'âge à partir de cela. J'ai essayé avec datrodiff code> mais ne peut pas sembler le faire fonctionner non plus. p>
3 Réponses :
Essayez ceci ....
Create function [dbo].[GetAge](@dayOfBirth datetime, @today datetime)
RETURNS varchar(100)
AS
Begin
DECLARE @tmpdate datetime, @date datetime, @years int, @months int, @days int
SELECT @tmpdate = @dayOfBirth
SELECT @years = DATEDIFF(yy, @tmpdate, @today) - CASE WHEN (MONTH(@tmpdate) > MONTH(@today)) OR (MONTH(@tmpdate) = MONTH(@today) AND DAY(@tmpdate) > DAY(@today)) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(yy, @years, @tmpdate)
SELECT @months = DATEDIFF(m, @tmpdate, @today) - CASE WHEN DAY(@tmpdate) > DAY(@today) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(m, @months, @tmpdate)
SELECT @days = DATEDIFF(d, @tmpdate, @today)
return cast(@years as varchar(2)) + ' years,' + cast(@months as varchar(2)) + ' months,' + cast(@days as varchar(3)) + ' days'
end
Select CLAIM.BTHDAT,dbo.[GetAge](CLAIM.BTHDAT,getdate()) From CLAIM
En supposant que vous voulez vieillir dans des années ... Que diriez-vous de datrodiff () code>
Couleur-moi surprise que cela fonctionne. Je ne pensais pas que la datrodiff prendrait une chaîne de Yyyymmdd. En théorie, la clause gauche () est inutile.
Voici une option pour obtenir l'âge avec précision, avec l'hypothèse que toutes les dates suivront le format yyyymmdd code> et seront des dates valides. SELECT CLAIM.BTHDAT
,DATEDIFF( YY, CONVERT(CHAR(8),CLAIM.BTHDAT), GETDATE())
- CASE WHEN SUBSTRING( CONVERT( char(8), GETDATE(), 112), 5, 4) < SUBSTRING( CONVERT( char(8), BTHDAT), 5, 4) THEN 1 ELSE 0 END
FROM CLAIM
Maintenant, si vous avez stocké votre DOB à l'aide d'une date
date code> DataType tout serait tellement plus facile.