如何加快日期的 SQL 查询

Ces*_*sar 1 sql sql-server

我有一个查询,我正在使用来自大约一百万行的 2 个表的内部联接。我正在尝试运行查询,因此它只获取上个月的数据。但是,使用 getDate() 函数需要很长时间。但是,当我以“2016-12-01”和“2017-01-01”这种格式输入日期时 - 它真的很快。如何修改查询以使其运行得更快?我读到我可能必须创建一个非聚集索引,但我还不太擅长这些。

select 
    custKey,
    sum(salesAmt) as Sales, 
    sum(returnAmt) as Credit, 
    (sum(salesAmt) - sum(returnAmt)) as CONNET
from
    [SpotFireStaging].[dbo].[tsoSalesAnalysis] 
inner join 
    [SpotFireStaging].[dbo].OOGPLensDesc as o on tsoSalesAnalysis.ItemKey = O.ItemKey
where 
    PostDate between --DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-1,0 ) 
--AND DATEADD(MS, -3,DATEADD(MM, DATEDIFF(M,-1, GETDATE()) -1, 0)) 
    '2016-12-01' and '2017-01-01'
group by 
    custkey
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 5

declare @startDate DateTime = DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-1,0 )
declare @endDate DateTime = DATEADD(MS, -3,DATEADD(MM, DATEDIFF(M,-1, GETDATE()) -1, 0)) 

select 
    custKey,
    sum(salesAmt) as Sales, 
    sum(returnAmt) as Credit, 
    (sum(salesAmt) - sum(returnAmt)) as CONNET
from
    [SpotFireStaging].[dbo].[tsoSalesAnalysis] 
inner join 
    [SpotFireStaging].[dbo].OOGPLensDesc as o on tsoSalesAnalysis.ItemKey = O.ItemKey
where 
    PostDate between @startDate AND @endDate
group by 
    custkey
Run Code Online (Sandbox Code Playgroud)

另一种选择,在此处查看所选答案:

在很多地方使用 GETDATE() 时,使用变量是否更好?

GetDate()为每一行单独计算,所以我们必须相信DateDiff()DateAdd()。所以我们最好把它移到一个局部变量中。