年齢を取得
関数を使用して、任意の時点で誰かの年齢を計算します。
何らかの理由で、日付が比較される膨大な量のプロジェクトに行き着くようです。この間、このデータの高速化と整合性を確保するための多くの機能を開発しました。
これを作成した理由は、someone年に誰かが生まれた年齢を計算すると、1日のばらつきが生じる可能性があるためです。うるう年では、29/02は01/03と同じ日です。
2つの日付を使用します。これにより、年齢が必要な時間(死亡日など)をさかのぼることができ、空白のままにすると現在の日付でのみデフォルトになります。
車輪の再発明を信じていないので、役に立つと思う人のためにコードをここに残しました。これには、以下にリンクされている二次機能が必要です。
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')
これまでのテストでは異常は明らかになりませんでしたが、見つかった場合はお知らせください。