SQL只返回今天的数据

时间:2013-05-09 14:14:53

标签: sql sql-server date

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

当前查询

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())

我可以使用更有效的查询来返回今天的数据吗?

3 个答案:

答案 0 :(得分: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()))

答案 1 :(得分:0)

如果要加快查询速度,请考虑索引。对于此查询,最有效的索引将在CallDetail(DNIS, ConnectedDateTimeGmt)上。

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

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

答案 2 :(得分: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