Espero que este sea perfecto siempre que acepte el algoritmo de que un bebé salteño envejece un año más el 29 de febrero sucesivo, o el 1 de marzo en años no bisiestos. @DOB debe contener una fecha dentro de algunos siglos de ahora, @AsOf debe contener una fecha similar> = @DOB:
SET @Age = YEAR(@AsOf) - YEAR(@DOB) - 1
IF MONTH(@AsOf) * 100 + DAY(@AsOf) >= MONTH(@DOB) * 100 + DAY(@DOB)
SET @Age = @Age + 1
yo realmente va a apreciar cualquier prueba y los comentarios que no he encontrado una manera aún para romperlo ... todavía.
Agregado - 01/31/2014: Éste parece funcionar perfectamente también a pesar de que a primera vista parece demasiado crudo:
SET @Age = FLOOR(DATEDIFF(dd,@DOB,@CompareDate)/365.25)
Pop estos en una función y aquí hay un script de prueba:
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
Saludos
PD: probablemente se puede modificar la decisión de febrero de 29 a ser un día antes si que flota su barco.
¿Podría realmente poner el código pertinente en su respuesta? Los enlaces a otros sitios web pueden (y se pueden) romper, por lo que en el futuro esta respuesta puede no ser útil si el enlace ya no funciona. –
@Tim C +1 por sugerir agregar código ya que el sitio web está actualmente fuera de servicio y esta respuesta hubiera sido inútil con solo un enlace. –