0

我需要从我的表中返回数据(今天)。我正在使用这个查询来完成这项工作,但没有我想要的那么快。

当前查询

WHERE (CallDetail.DNIS='456456') AND CallDetail.ConnectedDateTimeGmt > CAST(FLOOR(CAST(GETDATE() AS FLOAT))AS DATETIME)

我使用的另一个查询会在几秒钟内返回过去几周的数据。

WHERE (CallDetail.LocalName='Name') AND (CallDetail.ConnectedDate Between DATEADD(wk,-1,GetDate()) And GetDate())

有没有更有效的查询可以用来只返回今天的数据?

4

3 回答 3

0

您使用日期的交叉连接仅计算一次,不确定这将如何影响您的性能,但我过去曾使用过它,它似乎总是达到索引。

SELECT *

FROM [MyData]
CROSS JOIN (DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) AS CURRDATE) XJOIN

WHERE (CallDetail.DNIS='456456')
AND CallDetail.ConnectedDateTimeGmt > XJOIN.CURRDATE
于 2013-05-09T15:20:52.903 回答
0

而不是强制转换两次以从 GETDATE() 返回日期部分,这会减慢查询速度

WHERE (CallDetail.DNIS='456456') 
AND CallDetail.ConnectedDateTimeGmt > CAST(FLOOR(CAST(GETDATE() AS FLOAT))AS DATETIME)

使用更快的方法仅从 GETDATE() 返回日期部分

WHERE (CallDetail.DNIS='456456')
AND CallDetail.ConnectedDateTimeGmt > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
于 2013-05-09T14:21:42.863 回答
0

如果要加快查询速度,请考虑索引。对于这个查询,最有效的索引是 on CallDetail(DNIS, ConnectedDateTimeGmt)

您的第二个查询可能运行得更快,因为您在CallDetail(ConnectedDate)或上有一个索引CallDetail(LocalName)

仅对getdate()字段名称而不是字段名称进行日期算术的荣誉(这可能会阻碍索引的使用)。如果您使用的是更新版本的 SQL Server,那么最易读的方法是cast(getdate() as date)进行转换。但是,加快查询速度的方法是明智地使用索引。

于 2013-05-09T14:29:15.393 回答