TSQL确定正确的日子

时间:2011-04-14 11:22:15

标签: sql-server date

我昨天发现了一个问题,我的表格设计或我从中提取数据的查询,我需要一些关于如何处理和解决问题的指导/建议。

我的表格如下:

CREATE TABLE 
[DT].[CountTotals](
    [Acct] [varchar](8) NOT NULL,
    [TCount] [smallint] NOT NULL ,
    [TDate] [smalldatetime] NOT NULL,
    [PostDate] [smalldatetime] NOT NULL ,
    [DayCount] [tinyint] NULL ,
    [AggCount] [smallint] NULL ,
    [AggNumber] [numeric](10, 0) NULL,
    [IsReadyToArchive] [bit] NOT NULL 
)

我使用以下视图提取此数据:

CREATE VIEW [DT].[vwGetCountHistory]
AS

    SELECT     
        C.Acct, C.TCount, C.TDate, C.PostDate
        , C.DayCount, C.AggCount, C.AggNumber
    FROM DT.CountTotals C

    UNION

    SELECT     
        AC.Acct, AC.TCount, AC.TDate, AC.PostDate
        , AC.DayCount, AC.AggCount, AC.AggNumber
    FROM ARCHIVE.DTA.CountTotals AC

所有这一切都很好。该表有大约300k条记录总记录,包括每天添加约5000条新记录,PostDate是添加记录的日期。我的问题来自DayCount字段 - 该字段每天在表中增加1,直到PostDate is < GetDate()-90。我的问题在于以下查询:

SELECT     
        Acct
        , SUM(AggCount) AS SumofAggCount

    FROM DT.vwGetCountHistory
    WHERE (DayCount <= 5)
        AND 
        (
            PostDate >= @BusinessDate - 90
            AND PostDate <= @BusinessDate
        )
    GROUP BY Acct
    HAVING (SUM(AggCount) >= 4)

如果我正在搜索当前日期,则此查询非常有效,因为DayCount是正确的。但是愚蠢的我忘记了他们可以搜索前几天的数据,所以我的DayCount自PostDate以来每天都会增加。

我正在寻找有关如何解决此问题的建议。有没有办法确定正确的日数?

2 个答案:

答案 0 :(得分:1)

而不是存储&amp;管理DayCount,您可以在查询中计算@BusinessDate和PostDate之间的天数吗?

答案 1 :(得分:0)

我普遍同意@ n8wrl,DayCount很可能不会存储,应该动态计算,但如果这不是一个选项,那么至少要把它作为计算列,它是一个DATEDIFF之间的DATEDIFF PostDate和GETDATE()并摆脱那个夜间进程。当然,实际上,这仍然会在飞行中处理它,但我不认为由于夜间工作没有运行或运行两次等的潜在风险,性能损失会很差。

现在,您可以立即使DayCount测试更具动态性,例如:

WHERE (DayCount <= (5 + DATEDIFF(DAY, @BusinessDate, PostDate)))

这样做我们在条件中加1,以便它是DayCount&lt; = 6,因为昨天的合格记录现在的DayCount为6。