age
SQL Server データベースに列を作成する必要があります。
この列の値は、列の値に基づいて計算する必要がありますDOB
。
また、その値は増加するAge
につれて増加するはずです。
age
SQL Server データベースに列を作成する必要があります。
この列の値は、列の値に基づいて計算する必要がありますDOB
。
また、その値は増加するAge
につれて増加するはずです。
この問題を解決するには、計算列を使用する必要があります。これに似た定義を持つもの:
ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate())
BlackWaspで入手可能な元の声明と詳細情報。
編集:
MSDN は、計算列を次のように説明しています。
計算列は、同じテーブル内の他の列を使用できる式から計算されます。式は、計算されない列名、定数、関数、および 1 つ以上の演算子で接続されたこれらの任意の組み合わせにすることができます。式をサブクエリにすることはできません。
特に指定されていない限り、計算列はテーブルに物理的に格納されていない仮想列です。それらの値は、クエリで参照されるたびに再計算されます。データベース エンジンDatabase Engine は、CREATE TABLE および ALTER TABLE ステートメントで PERSISTED キーワードを使用して、計算列をテーブルに物理的に格納します。それらの値は、計算の一部である列が変更されると更新されます。計算列を PERSISTED としてマークすることにより、決定論的であるが正確ではない計算列にインデックスを作成できます。さらに、計算列が CLR 関数を参照している場合、データベース エンジンは関数が本当に決定的であるかどうかを確認できません。この場合、インデックスを作成できるように、計算列を PERSISTED にする必要があります。詳細については、計算列でのインデックスの作成を参照してください。
計算列は、選択リスト、WHERE 句、ORDER BY 句、または正規表現を使用できるその他の場所で使用できますが、次の例外があります。
CHECK、FOREIGN KEY、または NOT NULL 制約として使用される計算列は、PERSISTED とマークする必要があります。計算列の値が決定論的式によって定義され、結果のデータ型がインデックス列で許可されている場合、計算列はインデックスのキー列として、または任意の PRIMARY KEY または UNIQUE 制約の一部として使用できます。
たとえば、テーブルに整数列 a と b がある場合、計算列 a + b にはインデックスを付けることができますが、計算列 a + DATEPART(dd, GETDATE()) にはインデックスを付けることができません。
計算列は、INSERT または UPDATE ステートメントのターゲットにすることはできません。
データベース エンジンDatabase Engine は、使用される式に基づいて、計算列の null 可能性を自動的に判断します。ほとんどの式の結果は、null 非許容列のみが存在する場合でも、null 許容と見なされます。これは、アンダーフローまたはオーバーフローの可能性によっても null の結果が生成されるためです。COLUMNPROPERTY 関数を EnabledNull プロパティと共に使用して、テーブル内の計算列の null 可能性を調査します。null 値を許容する式は、ISNULL(check_expression, constant) を指定することにより、null 値を許容しない式に変えることができます。ここで、定数は、null の結果を置換する非 null 値です。
ソース: MSDN - 計算列
コードスニペット
ALTER TABLE
TheTable
ADD
DOB AS
CASE
WHEN
MONTH(Birth) > MONTH(ISNULL(Death, SYSDATETIME()))
OR (
MONTH(Birth) = MONTH(ISNULL(Death, SYSDATETIME()))
AND DAY(Birth) >= DAY(ISNULL(Death, SYSDATETIME()))
)
THEN
DATEDIFF(YEAR, Birth, ISNULL(Death, SYSDATETIME())) - 1
ELSE
DATEDIFF(YEAR, Birth, ISNULL(Death, SYSDATETIME()))
END
自動生成された列でテーブルを作成し、
CREATE TABLE Person2
(Id int IDENTITY(1,1) NOT NULL, Name nvarchar(50),
DOB date, Age AS DATEDIFF(YEAR, DOB ,GETDATE()) )
これは、年齢を取得する正しい方法です。
alter table <yourtable> add age as datediff(year, DOB, getdate())- case when month(DOB)*32 + day(DOB) > month(getdate()) * 32 + day(getdate()) then 1 else 0 end