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

有没有办法在 where 子句中不直接使用 GETDATE() ?

我正在使用 SQL Server 2000 和 2005。

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

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

4

5 回答 5

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  
于 2009-05-28T23:30:54.387 回答
2

和其他人一样,在黑暗中再次开枪……

也许您希望将其设为索引视图,而 getdate() 无法做到这一点,因为它是一个不确定的函数。我过去通过从另一个仅包含

select getdate()

这种间接级别足以欺骗 SQL Server 2000 并允许我使用模式绑定,但我不能保证这将适用于更高版本。

于 2009-05-28T23:50:25.143 回答
0
SELECT CURRENT_TIMESTAMP

SELECT {fn NOW()}

我可能误解了这个问题,如果您只是想移动 GetDate() 而不是替换它,您可以在 Have 子句中进行评估,即

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 回答
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 回答
-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 回答