如何避免在SQL视图中使用getdate()?

geo*_*tnz 7 sql database sql-server view

我正在编写一个数据库视图来总结一堆记录,其中日期列中的值在过去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
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有直接在where子句中使用GETDATE()的情况下执行此操作?

我正在使用SQL Server 2000和2005.

查看查询计划显示getdate()调用的成本仅为整个查询的0.03%(这比上面的查询要复杂得多),因此性能不是问题,但我喜欢我的查询是确定性的.

理想情况下,我还希望将-7参数公开为列,以便可以在查询视图的where子句中使用它.目前我正在考虑7,14,28天窗口的少量观看.

dkr*_*etz 6

您的问题的一个原因可能是通过删除数据转换使视图更加可优化.无法在视图中执行此操作,您需要将其设置为存储过程并将变换转换为变量:

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  
Run Code Online (Sandbox Code Playgroud)