We can use DATEDIFF
to get the Year, Month, and Day differences, and then simple division for the Seconds, Minutes, and Hours differences.
I've used @CurrentDate
to recreate the original request, but @CurrentDate = GETDATE()
will return the age at time of execution.
DECLARE @BirthDate DATETIME
DECLARE @CurrentDate DATETIME
SET @BirthDate = '2014-04-29 12:59:00.000'
SET @CurrentDate = '2014-04-29 13:10:23.000'
DECLARE @DiffInYears INT
DECLARE @DiffInMonths INT
DECLARE @DiffInDays INT
DECLARE @DiffInHours INT
DECLARE @DiffInMinutes INT
DECLARE @DiffInSeconds INT
DECLARE @TotalSeconds BIGINT
-- Determine Year, Month, and Day differences
SET @DiffInYears = DATEDIFF(year, @BirthDate, @CurrentDate)
IF @DiffInYears > 0
SET @BirthDate = DATEADD(year, @DiffInYears, @BirthDate)
IF @BirthDate > @CurrentDate
BEGIN
-- Adjust for pushing @BirthDate into future
SET @DiffInYears = @DiffInYears - 1
SET @BirthDate = DATEADD(year, -1, @BirthDate)
END
SET @DiffInMonths = DATEDIFF(month, @BirthDate, @CurrentDate)
IF @DiffInMonths > 0
SET @BirthDate = DATEADD(month, @DiffInMonths, @BirthDate)
IF @BirthDate > @CurrentDate
BEGIN
-- Adjust for pushing @BirthDate into future
SET @DiffInMonths = @DiffInMonths - 1
SET @BirthDate = DATEADD(month, -1, @BirthDate)
END
SET @DiffInDays = DATEDIFF(day, @BirthDate, @CurrentDate)
IF @DiffInDays > 0
SET @BirthDate = DATEADD(day, @DiffInDays, @BirthDate)
IF @BirthDate > @CurrentDate
BEGIN
-- Adjust for pushing @BirthDate into future
SET @DiffInDays = @DiffInDays - 1
SET @BirthDate = DATEADD(day, -1, @BirthDate)
END
-- Get number of seconds difference for Hour, Minute, Second differences
SET @TotalSeconds = DATEDIFF(second, @BirthDate, @CurrentDate)
-- Determine Seconds, Minutes, Hours differences
SET @DiffInSeconds = @TotalSeconds % 60
SET @TotalSeconds = @TotalSeconds / 60
SET @DiffInMinutes = @TotalSeconds % 60
SET @TotalSeconds = @TotalSeconds / 60
SET @DiffInHours = @TotalSeconds
-- Display results
SELECT @DiffInYears AS YearsDiff,
@DiffInMonths AS MonthsDiff,
@DiffInDays AS DaysDiff,
@DiffInHours AS HoursDiff,
@DiffInMinutes AS MinutesDiff,
@DiffInSeconds AS SecondsDiff