Tôi hy vọng điều này là hoàn hảo với điều kiện bạn chấp nhận thuật toán rằng một đứa bé nhảy bước một tuổi lớn hơn vào ngày 29 tháng 2, hoặc ngày 1 tháng 3 vào những năm không nhuận. @DOB phải chứa ngày trong vòng vài thế kỷ nay, @AsOf phải chứa ngày tương tự> = @DOB:
SET @Age = YEAR(@AsOf) - YEAR(@DOB) - 1
IF MONTH(@AsOf) * 100 + DAY(@AsOf) >= MONTH(@DOB) * 100 + DAY(@DOB)
SET @Age = @Age + 1
Tôi muốn REALLY REALLY đánh giá cao bất kỳ thử nghiệm và ý kiến như tôi đã không tìm thấy một cách chưa phá vỡ nó ... được nêu ra.
Added - 2014/01/31: Cái này dường như làm việc một cách hoàn hảo quá mặc dù thoạt nhìn có vẻ quá thô:
SET @Age = FLOOR(DATEDIFF(dd,@DOB,@CompareDate)/365.25)
Pop này trong một hàm và đây là một kịch bản thử nghiệm:
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
Chúc mừng
PS: Có thể bạn có thể chỉnh sửa quyết định ngày 29 tháng 2 trở về sớm hơn nếu thuyền trôi nổi.
Bạn có thể đặt mã thích hợp trong câu trả lời của mình không? Các liên kết đến các trang web khác có thể (và thực hiện), và vì vậy trong tương lai, câu trả lời này có thể không hữu ích nếu liên kết không còn hoạt động nữa. –
@Tim C +1 để đề xuất thêm mã kể từ khi trang web hiện đang ngừng hoạt động và câu trả lời này sẽ vô dụng chỉ với một liên kết. –