以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  請教SQL條件比較問題  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=51854)

--  作者:don
--  发布时间:2014/6/4 15:34:00
--  請教SQL條件比較問題
請教下面三種,哪種高效些?多謝!

A.Select * From {订单} Where  日期 BETWEEN #5/1/2014# AND #5/31/2014#
B.Select * From {订单} Where Year(日期) = 2014 And  Month(日期) = 5
C.Select * From {订单} Where Format(日期,\'yyyyMM\') = \'201405\'


--  作者:Bin
--  发布时间:2014/6/4 15:36:00
--  
这恐怕要用大量数据实际测试一下了, 坐等结果.
--  作者:有点甜
--  发布时间:2014/6/4 15:45:00
--  
 不知道,个人感觉最原始的最快。数据库对语法的优化也应该是这样做的。
--  作者:jspta
--  发布时间:2014/6/4 16:48:00
--  

MSSQL2005,测试表格20W行数据,查询数据3373行,

A.Select * From {订单} Where  日期 BETWEEN #5/1/2014# AND #5/31/2014#
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

(3373 行受影响)

SQL Server 执行时间:
   CPU 时间 = 31 毫秒,占用时间 = 328 毫秒。


B.Select * From {订单} Where Year(日期) = 2014 And  Month(日期) = 5
SQL Server 分析和编译时间: 
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

(3373 行受影响)

SQL Server 执行时间:
   CPU 时间 = 62 毫秒,占用时间 = 325 毫秒。

C.Select * From {订单} Where Format(日期,\'yyyyMM\') = \'201405\'

不支持



增加月份数量,没有太多时间差别,误差不高于0.1s,反而当跨月份甚至年度的时候,方案1书写更加简洁


--  作者:don
--  发布时间:2014/6/4 17:16:00
--  
多謝兩位版主!不知以下兩種是否這樣?

B.  Select * From {订单} Where Year(日期) = 2014 And  Month(日期) = 5      
等於:Select * From (Select * ,Year(日期) As  年, Month(日期) As 月 From {订单})  Where 年= 2014 And 月 = 5 

C.   Select * From {订单} Where Format(日期,\'yyyyMM\') = \'201405\'
等於:Select * From (Select * , Format(日期,\'yyyyMM\')  As   年月 From {订单})  Where 年月 =  \'201405\'