0

3つの列に基づく複合主キーを持つテーブルがあります。

(Unit, Account, service)

別の2つの列があります:(DOBこれは生年月日を保持します)&Age(これはDOBに基づいて更新する必要がある新しいint列であり、結果は年の整数値になります)

Ageの結果を取得する方法を知っています

select datediff(Year,DOB,GETDATE()) as AGE

ただし、行のDOBデータに基づいてテーブル全体を更新する方法がわかりません。

列はUnit, Account, Service, DOB, Age

4

3 に答える 3

2

コメントによると、Ageは毎日変化するため(異なるタイムゾーンのユーザーがいる場合はもっと頻繁に)、Ageを保持するのは賢明ではありません。

また、AgevsDOBアルゴリズムは正確ではありません-より良いものについてはこちらをご覧ください

結果として、IMOは、次のように、永続化されていないCOMPUTED列が意味をなす1つのシナリオです。

ALTER TABLE Person add Age 
AS DateDiff(yy,DOB,CURRENT_TIMESTAMP) 
- CASE WHEN DATEPART  (mm,DOB) <= DATEPART(mm,CURRENT_TIMESTAMP) 
       and DATEPART(dd, DOB) <= DATEPART(dd,CURRENT_TIMESTAMP)
    THEN 0 
    ELSE 1
  END
于 2012-10-26T14:32:02.333 に答える
1

列を取り除き、次のageように年齢を計算します。

SELECT DATEDIFF(yy, DOB, getdate()) AS age FROM daffyduck

年齢などのアイテムを保存する必要がある非常にまれなケースがあります。年齢は毎日変わるため、レコードを頻繁に更新する必要があります。代わりに、計算可能な生年月日などの固定値を保存することをお勧めします。ほとんどのDBMSは、この理由で日付演算を実行するための機能を提供します。

于 2012-10-26T14:28:12.683 に答える
1

あなたの質問に答えるには:

UPDATE dob.MyTable SET Age = datediff(Year,DOB,GETDATE());

これにより、要件に従ってテーブル全体が更新されます。

ただし、ここで他のすべての回答を確認することを強くお勧めします。特に上記式の計算誤差に関するもの。

于 2012-10-26T14:50:33.513 に答える