用日期编写SQL where子句的更好方法

时间:2015-02-19 17:33:46

标签: sql-server sql-server-2008

我正在运行一个SQL语句,如下所示。这最终将用于每天使用日期交易填充报告表。当我在没有

的情况下运行它
Cast(M._CreateDateTime as Date) = @StartDate

需要1:40。 将函数返回到where子句中需要10分钟。

Declare @StartDate DAte = GetDate()

If Object_ID ('tempdb.dbo.#WinBack') is not null Drop Table #WinBack

Select
  M.HospitalMasterID
  ,M.TxnSite
  ,P.ClientID
  ,M.PatientID
  ,M.TxnDate as CallDate
  ,M.TxnCode
  ,M.EnteredMasterID
  ,U.UserName
  ,U.UserDept
Into
  #WinBack
From
  Avimark_OLTP.dbo.MedicalHistory as M
  Inner JoinAvimark_OLTP.dbo.Patient as P on
    M.HospitalMasterID = P.HospitalMasterID and
    M.PatientID = P.PatientID
  Left Outer Join RptSys.dbo.Ref_User as U on
    M.EnteredMasterID = U.UserMastID
Where
  Cast(M._CreateDateTime as Date) = @StartDate and
  M.TxnCode = 'RemCall' and
  U.UserName is not null

有没有人对如何提高速度有任何建议?我知道这是杀死它的演员。

谢谢,

1 个答案:

答案 0 :(得分:1)

使用列的函数可以使SQL Server在表中比较和阻止索引使用的每一行中进行转换,你应该这样做:

Declare @StartDate Date, @EndDate Date

set @StartDate = GetDate()
set @EndDate = dateadd(day, 1, @StartDate)

select 
   ... 
where 
    M._CreateDateTime >= @StartDate and 
    M._CreateDateTime < @endDate