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.
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. –
@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. –