--情况一,条件中先将operdate转化为字符,再比较
select * from tt where CONVERT(VARCHAR,operdate,23) BETWEEN '2000-08-01' AND '2009-08-25'
--情况二,条件中直接比较operdate
select * from tt where operdate BETWEEN '2000-08-01' AND '2009-08-25 23:59:59.999'

解决方案 »

  1.   

    --楼主第一句写得有点问题吧 应该这样?
    select * from tt where CONVERT(VARCHAR,operdate,120) BETWEEN '2000-08-01' AND '2009-08-25'
      

  2.   

    好像听说,在where后的,索引字段上用函数时,就不会用到索引
      

  3.   

    --如果operdate 是加索引的列 那么 第二条比较快 
    --第一条用了 convert转换索引失效
      

  4.   

    第二种执行效率高,convert 很耗时间
      

  5.   

    convert()是相当影响速度的呀。
    一定是第二条快。但是从程序严谨性上来说,第二种不如第一种。
      

  6.   

    第二种快,不用函数能减少很多IO开销吧。
    索引的问题要分聚焦和非聚焦分开看,如果是聚焦索引两个语句都会用到索引,如果是非聚焦索引因为前面是SELECT *所以第一条语句用不到索引,第二条语句能用到。
    如上,希望对楼主有帮助。
      

  7.   

    应该是第二,convert会影响速度。
      

  8.   

    感觉是第二种会快一点,在日期比较的时候不推荐用convert转换,直接用between
      

  9.   

    个人觉得第二个效率会高些,你自己写的强制转换,
    但是系统要比较两个数值最终肯定还是要隐性转换
    为数值来比较的,既然如此,你自己转换了一下
    然后系统再在后台强制转换一下最后比较;
    或许datetime可以更快转换为数值比较或一步到位
    然而你转换为字符之后,看象是字符串与字符串的比较,最终还是要转换为数值
    个人拙见...
      

  10.   

    谢谢各位的回复,我也测试了,确实如各位所言。总结一下:
    1、在operdate没有索引的情况下,两者执行效率几乎没有差别,但还是应该选用第二种情况
    2、在operdate有非聚集索引的情况下,第二种情况的效率明显比第一种情况高
    3、operdate有聚集索引的情况我没有测试结帐送分~~