Получить возраст
По какой-то причине мы, похоже, оказались в огромном количестве проектов, в которых сравниваются даты. За это время мы разработали ряд функций для ускорения и обеспечения целостности этих данных.
Причина, по которой мы создали это, заключалась в том, что разработка возраста, в котором кто-то родился в високосный год, могла закончиться с разницей в один день. В високосный год 29/02 - это тот же день года, что и 01/03.
Мы используем две даты, так как это позволяет вам задним числом указать требуемое время (например, дату смерти) и использовать значение по умолчанию для текущей даты, если оно оставлено пустым.
Поскольку мы не верим в переизобретение колеса, мы оставили здесь свой код для тех, кто может найти его полезным. Это требует дополнительной функции, связанной ниже.
CREATE FUNCTION Dates.GetAge(@Date DATETIME2,@Until DATETIME2) RETURNS INT AS BEGINIF @Until IS NULL SET @Until=CONVERT(DATE,GETDATE())DECLARE @Age INT=DATEDIFF(YEAR,@Date,@Until)+(CASE WHEN DATEPART(DAYOFYEAR,@Date)>(DATEPART(DAYOFYEAR,@Until)+(CASE WHEN dbo.GetLeapYear(@Until)=1 AND DATEPART(DAYOFYEAR,@Until)>59 THEN -1 ELSE 0 END))THEN -1 ELSE 0 END)RETURN @AgeENDGO
SELECT Dates.GetAge('2011-02-28','2013-02-27'),Dates.GetAge('2011-02-28','2013-02-28'),Dates.GetAge('2011-02-28','2013-03-01'),Dates.GetAge('2011-02-28','2013-03-02')SELECT Dates.GetAge('2011-02-28','2012-02-27'),Dates.GetAge('2011-02-28','2012-02-28'),Dates.GetAge('2011-02-28','2012-02-29'),Dates.GetAge('2011-02-28','2012-03-01')SELECT Dates.GetAge('2012-02-28','2013-02-27'),Dates.GetAge('2012-02-28','2013-02-28'),Dates.GetAge('2012-02-28','2013-03-01'),Dates.GetAge('2012-02-28','2013-03-02')SELECT Dates.GetAge('2012-02-29','2013-02-27'),Dates.GetAge('2012-02-29','2013-02-28'),Dates.GetAge('2012-02-29','2013-03-01'),Dates.GetAge('2012-02-29','2013-03-02')
До настоящего времени тестирование не выявило каких-либо аномалий, однако, пожалуйста, сообщите нам, если вы их обнаружите.