2013-04-05 32 views
12

私はユーザーテーブルを使用しており、「期間終了日」を設定したいと考えています。基本的に、新しいユーザーには、保護観察期間の一部として参加してから2ヶ月間のフルタイムがあります。私は私のユーザーテーブルの列に数式を配置することができますが、代わりにこれを更新するスクリプトを持っている必要がありますか、またはこれは計算された列を使用するための許容時間ですかと思っています。この表にはさまざまなことがあり、パフォーマンスマイルストーンの成果に基づいてユーザーの行が更新されることがあります。出願日は決して変更/更新されません。SQL Serverの計算された列のベストプラクティス

私の質問は:計算された列をこのような状況で使用するのがよいか、または(私がアプリケーションの日付を更新するつもりはないが)その行を更新するたびに再計算されますか?私は将来、行を更新するときにオーバーヘッドを増やしたくありません。私は保護観察終了日の列定義で使用している

式:

(dateadd(day,(-1),dateadd(month,(3),dateadd(day,(1)-datepart(day,[APP_DT]),[APP_DT])))) 
+0

は「参加日」であり、「申請日(私は2ヶ月のうちの月の終わりを取得するために、わずかに少ないconvul​​tedアプローチを使用注意してください。) " 同じこと?他の日付列とは独立して保護観察終了日を後で更新できるようにしたいですか? –

+0

2ヶ月の方針は変わりますか?それは将来1または3(または他の値)になることができますか? –

+0

はい、JoinDate/AppDate同じこと(申し訳ありませんが、私はそれらを交換可能に使用します)。私は日付を上書きすることはありませんが、更新されないので、挿入スクリプトの一部としてそれを含めることにします。私はこれも索引付けする必要があり、永続的なものがなければ、うまく機能しません。雷の素早い返信に感謝します! – Brian

答えて

15

は、それが設定されていたら、この日はほとんどの場合決して変わらないことを見て、それはおそらく、計算列のための良い候補ではありません。

すべての場合:一度テーブルに行を挿入すると、すぐに「保護観察期間の終了」日付を簡単に計算して(トリガーなどで)簡単に設定することができます。

このように確実に行うことができますが、AFTER INSERTトリガー(またはINSERT操作のストアドプロシージャ)を使用して、その値を1回だけ計算して保存することをお勧めします。

また、ヘッズアップと同じように、計算式の列はアクセスするたびに計算されています。そのことに注意してください。つまり、PERSISTEDキーワードを指定しないと、結果はその行の他のデータと並んで保存されます。これは、一度計算された値がバインドされていないため再び変わる。

+0

返信いただきありがとうございます。計算された列をよりよく使用するためには、データが常にシフトしていることがあります。私はマイルストーンの成果を集計しています。さまざまな成果が出て、人のスコアが上がりました。計算された列をより適切に使用しているように思えますが、正しいのでしょうか? – Brian

+0

@Brian:そうですね。または、時間とともに変化する可能性のある日付があり、その日付の月と年を選択またはグループ化する必要があるクエリの場合は、その日付の計算された(および持続された)月と年が完璧です。これらの永続化された計算カラムも非常に簡単にインデックス付けします。 –

+1

ありがとう、これはとても役に立ちました! – Brian

0

データを挿入するときにオーバーヘッドはありません。列を読み取ったときにのみ、この列の値が計算されます。だからあなたのアプローチが正しいと思います。

11

アプリケーションの日付を変更せずに後で誰かの保護期間を延長する場合は、計算された列は移動方法ではありません。なぜ、両方の列にDEFAULT制約を使用しないのですか?

USE tempdb; 
GO 

CREATE TABLE dbo.foo 
(
    MemberID INT IDENTITY(1,1), 
    JoinDate DATE NOT NULL DEFAULT SYSDATETIME(), 
    ProbationEndDate NOT NULL DEFAULT 
    DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0)) 
); 

INSERT dbo.foo DEFAULT VALUES; 

SELECT MemberID, JoinDate, ProbationEndDate FROM dbo.foo; 

結果:

MemberID JoinDate  ProbationEndDate 
-------- ---------- ---------------- 
1   2013-04-05 2013-06-30 

+3

私は月の最後の日に、その方法を愛しています:) – Brian

関連する問題