Mam nadzieję, że ten jest idealny, pod warunkiem, że zaakceptujesz algorytm, że dziecko-skaczarka przewraca rok o kolejne 29 lutego lub 1 marca w lata wolne od skoku. @DOB musi zawierać datę w ciągu kilku stuleci teraz musi @AsOf zawierają podobną datę> = @DOB:
SET @Age = YEAR(@AsOf) - YEAR(@DOB) - 1
IF MONTH(@AsOf) * 100 + DAY(@AsOf) >= MONTH(@DOB) * 100 + DAY(@DOB)
SET @Age = @Age + 1
bym naprawdę bardzo wdzięczni za wszelkie testy i komentarze jak już nie znalazł sposób jeszcze go złamać ... jeszcze.
dodane - 31.01.2014: To wydaje się doskonale pracować zbyt chociaż na pierwszy rzut oka wygląda to zbyt surowy:
SET @Age = FLOOR(DATEDIFF(dd,@DOB,@CompareDate)/365.25)
Pop to w funkcji i oto skrypt testowy:
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
Cheers
PS: prawdopodobnie można dostosować decyzję 29 lutego do bycia dzień wcześniej, czy to pływa łodzią.
Czy mógłbyś umieścić odpowiedni kod w swojej odpowiedzi? Linki do innych stron internetowych mogą (i są) łamane, więc w przyszłości ta odpowiedź może nie być przydatna, jeśli link przestanie działać. –
@ Przyspiesz C +1 za sugestię dodawania kodu, ponieważ witryna jest obecnie wyłączona, a ta odpowiedź byłaby bezużyteczna z tylko linkiem. –