7

日付列の値が過去 7 日間以内の一連のレコードを合計するデータベース ビューを作成しています。次のようになります。

CREATE VIEW RecentRecordSum AS
SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum
FROM        SomeTable t
WHERE       t.RecordDate >= DATEADD(d,-7,GETDATE())
GROUP BY    t.ID

GETDATE() を where 句に直接入れずにこれを行う方法はありますか?

SQL Server 2000 および 2005 を使用しています。

クエリ プランを見ると、getdate() 呼び出しのコストはクエリ全体の 0.03% にすぎないことがわかります (これは上記のものよりもかなり複雑です)。したがって、パフォーマンスは問題ではありませんが、クエリを決定論的にするのが好きです。 .

理想的には、-7 パラメーターを列として公開して、ビューを照会する何かの where 句で使用できるようにしたいと考えています。現在、7 日、14 日、28 日ウィンドウの少数のビューを検討しています。

4

5 に答える 5

6

あなたの質問の理由の 1 つは、データ変換を削除してビューをより最適化できるようにすることです。ビューでは実行できません。ストアド プロシージャにして変数に変換する必要があります。

CREATE PROCEDURE RecentRecordSum AS

DECLARE @adate DATETIME

SELECT @adate = DATEADD(d, -7, GETDATE())

SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum  
FROM        SomeTable t  
WHERE       t.RecordDate >= @adate  
GROUP BY    t.ID  
于 2009-05-28T23:30:54.387 に答える
2

他のみんなと同じように、暗闇の中で別のショット...

おそらく、これをインデックス付きビューにしたいと考えているかもしれませんが、これは不確定関数であるため、getdate() では実行できません。私は過去に getdate() を含む別のビュー内から呼び出すことでこれを回避しました

select getdate()

このレベルの間接性は、SQL Server 2000 をだましてスキーマ バインドを使用するのに十分でしたが、これが新しいバージョンで機能することは保証できません。

于 2009-05-28T23:50:25.143 に答える
0

質問を正しく理解している場合は、次のクエリのように、GETDATE() を含むセットで内部結合をいつでも試すことができます。

SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum
FROM        SomeTable t
INNER JOIN (SELECT DATEADD(d,-7,GETDATE()) AS MIN_DATE) MIN_DATE_SET
ON t.RecordDate >= MIN_DATE_SET.MIN_DATE
GROUP BY    t.ID

編集: 同様のシナリオのクエリ プランを見てきましたが、それらは同一です。YMMV。

于 2009-05-28T23:16:30.080 に答える
0
SELECT CURRENT_TIMESTAMP

SELECT {fn NOW()}

質問を誤解している可能性があります。GetDate() を移動しようとしていて、置き換えようとしない場合は、Having 句で評価を行うことができます。

CREATE VIEW RecentRecordSum AS
SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum
FROM        SomeTable t
GROUP BY    t.ID, t.RecordDate
HAVING      t.RecordDate >= DATEADD(d,-7,GETDATE())
于 2009-05-28T23:11:04.270 に答える
-1

最近の日のデータがあると仮定すると、サブクエリが機能する可能性があります。

CREATE VIEW RecentRecordSum AS
SELECT      t.ID,   
            SUM(t.SomeValue) AS ValueSum
FROM        SomeTable t
WHERE       t.RecordDate >= DATEADD(d,-7,(Select Max(RecordDate) From SomeTable))
GROUP BY    t.ID
于 2009-05-29T00:08:10.490 に答える