2012-03-14 74 views
0

我在SQL Server2005中有一个查询,其中2个日期字段进行比较。如果我不包含时间并仅使用日期部分进行比较,则查询运行速度很快(以毫秒为单位)。但是,我需要将时间与日期部分进行比较。如果我包含时间部分,查询运行速度非常慢,并最终返回连接超时错误。SQL服务器日期时间比较花费时间来执行

`((startdate1 >= @startdate2 and enddate1 <= @enddate2) or 
(startdate1 <= @startdate2 and enddate1 >= @startdate2 and enddate1 <= @enddate2) or 
(startdate1 >= @startdate2 and startdate1 < @enddate2 and enddate1 > @enddate2) or 
(startdate1 < @startdate2 and enddate1 > @enddate2))` 

这部分查询花了很多时间来执行。但是,如果我将查询更改为以下格式,查询运行速度非常快。

((cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime)  
AND cast(CONVERT(VARCHAR(10),enddate1,101) as datetime)<= cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)) OR  

(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) <= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime)  
AND ((cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime))  
AND (cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) <= cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime) ))) OR 

(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) >= cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime) and  
((cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) < cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime)) AND  
(cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) > cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime) ))) OR  

(cast(CONVERT(VARCHAR(10),startdate1,101) as datetime) < cast(CONVERT(VARCHAR(10),@startdate2,101) as datetime) and  
cast(CONVERT(VARCHAR(10),enddate1,101) as datetime) > cast(CONVERT(VARCHAR(10),@enddate2,101) as datetime))) 

请给我建议一些想法。在此先感谢...

+0

......没有意义。针对列的所有这些转换应排除任何潜在的索引使用情况,而第一个查询应能够使用索引(如果存在)。你对这些列有任何有用的索引吗? – 2012-03-14 10:50:40

+0

对第一种情况缓存错误的查询计划?使用fullscan运行'更新统计信息'(这应该刷新缓存并重新计算统计信息)并重试。 – Arvo 2012-03-14 10:51:34

+0

如何使用fullscan在yourtable上运行'更新统计信息' – ASD 2012-03-14 11:10:58

回答

0

你试过DateDiff函数吗?

+0

是的..试过......这也是需要时间来执行的。代码片段是:((dateiff(mm,@ startdate2,startdate1)> = 0且datediff(mm,@ enddate2,enddate1)<= 0)或 (datediff(mm,@startdate2,startdate1)<= 0且datediff mm,@startdate2,enddate1)> = 0且datediff(mm,@ enddate2,enddate1)<= 0)或 (datediff(mm,@startdate2,startdate1)> = 0且datediff(mm,@ enddate2,startdate1)< (mm,@ enddate2,enddate1)> 0) – ASD 2012-03-14 10:45:03

+0

执行时间超过20分钟在表 – ASD 2012-03-14 10:46:32

+0

只有10条记录这没有意义,你定义这些变量的类型是什么?你可以在你的程序中粘贴更多的代码 – 2012-03-14 15:58:50