DATEADD 関数と DATEDIFF 関数の組み合わせで閏年もしっかり考慮
SQL Server で、生年月日と現在の日付に基づいて年齢を計算するには、いくつかの方法があります。ここでは、最も一般的で使いやすい 2 つの方法をご紹介します。
方法 1: DATEDIFF 関数を使用する
DATEDIFF 関数は、2 つの日付間の差を計算するために使用されます。年齢を計算するには、DATEDIFF 関数を使用して、生年月日と現在の日付の差を年単位で計算します。
SELECT DATEDIFF(YEAR, BirthDate, GETDATE()) AS Age
FROM Customers;
このクエリは、Customers
テーブル内のすべての顧客の年齢を計算し、Age
という名前の列に結果を格納します。
DATEADD 関数は、指定された日付に期間を追加するために使用されます。年齢を計算するには、DATEADD 関数を使用して、生年月日に経過した年数を追加し、現在の日付と比較します。
SELECT DATEADD(YEAR, DATEDIFF(YEAR, BirthDate, GETDATE()), BirthDate) AS CurrentAge
FROM Customers;
補足
- 上記の例では、
BirthDate
列がCustomers
テーブルにあることを前提としています。使用する列名が異なる場合は、それに応じてクエリを修正する必要があります。 - DATEDIFF 関数は、2 つの入力パラメータ間の日付差を計算します。最初の入力パラメータは、結果を表現する単位を指定します。この場合、結果は年単位で表されるため、
YEAR
を使用します。2 番目の入力パラメータは、比較する 2 つの日付を指定します。この場合、最初の入力パラメータはBirthDate
列、2 番目の入力パラメータはGETDATE()
関数です。 - DATEADD 関数は、指定された日付に期間を追加します。最初の入力パラメータは、追加する期間の単位を指定します。この場合、期間は年単位で表されるため、
YEAR
を使用します。2 番目の入力パラメータは、期間を追加する日付を指定します。この場合、最初の入力パラメータはDATEDIFF(YEAR, BirthDate, GETDATE())
関数によって返される値です。3 番目の入力パラメータは、期間を追加する基準となる日付を指定します。この場合、基準となる日付はBirthDate
列です。
その他の考慮事項
- 閏年を考慮する場合は、より複雑な計算が必要になります。詳細については、SQL Server のドキュメントを参照してください。
- 年齢を月単位または日単位で計算することもできます。これを行うには、DATEDIFF 関数と DATEADD 関数の他の単位を使用します。
CREATE TABLE Customers (
CustomerID INT IDENTITY PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
BirthDate DATE
);
INSERT INTO Customers (FirstName, LastName, BirthDate)
VALUES ('John', 'Doe', '1980-01-01'),
('Jane', 'Doe', '1985-07-14'),
('Peter', 'Jones', '1990-12-25');
SELECT CustomerID, FirstName, LastName, BirthDate, DATEDIFF(YEAR, BirthDate, GETDATE()) AS Age
FROM Customers;
結果
CustomerID | FirstName | LastName | BirthDate | Age |
---|---|---|---|---|
1 | John | Doe | 1980-01-01 | 44 |
2 | Jane | Doe | 1985-07-14 | 38 |
3 | Peter | Jones | 1990-12-25 | 33 |
SELECT CustomerID, FirstName, LastName, BirthDate, DATEADD(YEAR, DATEDIFF(YEAR, BirthDate, GETDATE()), BirthDate) AS CurrentAge
FROM Customers;
CustomerID | FirstName | LastName | BirthDate | CurrentAge |
---|---|---|---|---|
1 | John | Doe | 1980-01-01 | 2024-01-01 |
2 | Jane | Doe | 1985-07-14 | 2024-07-14 |
3 | Peter | Jones | 1990-12-25 | 2024-12-25 |
説明
- 上記のサンプルコードは、
Customers
テーブル内のすべての顧客のレコードをループ処理します。 - 各レコードについて、以下の処理が行われます。
FirstName
、LastName
、BirthDate
列の値を取得します。DATEDIFF(YEAR, BirthDate, GETDATE())
関数を使用して、生年月日と現在の日付の差を年単位で計算します。DATEADD(YEAR, DATEDIFF(YEAR, BirthDate, GETDATE()), BirthDate)
関数を使用して、生年月日に経過した年数を追加し、現在の日付を計算します。- 取得した値を、
CustomerID
、FirstName
、LastName
、BirthDate
、Age
またはCurrentAge
列の値とともに新しい行として結果セットに追加します。
このサンプルコードは、SQL Server で生年月日と現在の日付に基づいて年齢を計算する方法を理解するための出発点として使用できます。必要に応じて、独自の要件に合わせてコードをカスタマイズすることができます。
SQL Server で生年月日と現在の日付に基づいて年齢を計算するその他の方法
この方法は、MONTH 関数と YEAR 関数を使用して、生年月日の月と年を抽出し、現在の日付の月と年と比較することで、年齢を計算します。
SELECT
CustomerID,
FirstName,
LastName,
BirthDate,
YEAR(GETDATE()) - YEAR(BirthDate) - (
CASE
WHEN MONTH(GETDATE()) < MONTH(BirthDate) THEN 1
ELSE 0
END
) AS Age
FROM Customers;
この方法は、CAST 関数を使用して、生年月日を datetime
データ型に変換してから、DATEDIFF 関数を使用して、現在の日付との差を計算します。
SELECT
CustomerID,
FirstName,
LastName,
BirthDate,
DATEDIFF(YEAR, CAST(BirthDate AS DATETIME), GETDATE()) AS Age
FROM Customers;
この方法は、ROW_NUMBER 関数と OVER 句を使用して、各顧客の行番号を計算し、その行番号を使用して、生年月日から現在の日付までの経過年数を計算します。
SELECT
CustomerID,
FirstName,
LastName,
BirthDate,
ROW_NUMBER() OVER (ORDER BY BirthDate) AS RowNumber,
DATEDIFF(YEAR, BirthDate, GETDATE()) - (
MAX(CASE WHEN RowNumber < RowNumberOver(PARTITION BY BirthDate ORDER BY BirthDate) THEN 1 ELSE 0 END)
OVER (PARTITION BY BirthDate ORDER BY BirthDate)
) AS Age
FROM Customers;
各方法の比較
方法 | 長所 | 短所 |
---|---|---|
DATEDIFF 関数を使用する | シンプルでわかりやすい | 閏年を考慮していない |
DATEADD 関数と DATEDIFF 関数を使用する | 閏年を考慮している | DATEDIFF 関数を使用するよりも複雑 |
MONTH 関数と YEAR 関数を使用する | シンプルでわかりやすい | 閏年を考慮していない |
CAST 関数と DATEDIFF 関数を使用する | 閏年を考慮している | CAST 関数の使用により、パフォーマンスが若干低下する可能性がある |
ROW_NUMBER 関数と OVER 句を使用する | 複雑なクエリで使用できる | 他の方法よりも複雑 |
SQL Server で生年月日と現在の日付に基づいて年齢を計算するには、さまざまな方法があります。最良の方法 は、特定の要件とパフォーマンス要件によって異なります。
上記の方法は、あくまでも出発点として提供されています。必要に応じて、独自の要件に合わせてコードをカスタマイズすることができます。
sql sql-server t-sql