MySQL BETWEEN和“> = AND< =”给出不同的结果

时间:2012-02-21 00:21:43

标签: php mysql

MySQL BETWEEN运算符与使用“> =< =”之间有什么区别吗?

当我在这个查询上尝试它们时,它们会给出不同的结果。

SELECT 
      tblStaff.TitleGredCd,
      count(StudCourse1.StaffNoIC),     
      StudCourse1.StaffNoIC,
      StaffNm,
      BranchNm, 
      StDt, 
      EndDt, 
      SUM(datediff(EndDt,StDt)+1)  
      TotalDay, 
      (SELECT SUM( pembelajaranhour ) 
         FROM tblpembelajaran d 
         WHERE d.StaffNoIC = tblStaff.StaffNoIC
           AND YEAR( PembelajaranDate ) = 2011 )Totalhour,
      (SELECT SUM( datediff( kendiridate, kendiridate ) +1 ) 
         FROM tblkendiri d 
         WHERE d.StaffNoIC = tblStaff.StaffNoIC 
           AND YEAR( kendiridate ) = 2011 ) Totalkendiriday
   FROM 
      StudCourse1, 
      tblStaff 
         LEFT OUTER JOIN tblRefBranch 
            ON tblStaff.BranchCd = tblRefBranch.BranchCd, 
      tblRefTitleGred
   WHERE 
          StudCourse1.StaffNoIC = tblStaff.StaffNoIC 
      AND tblStaff.TitleGredCd = tblRefTitleGred.TitleGredCd 
     [Date Condition]
   GROUP BY 
      tblStaff.TitleGredCd, 
      StudCourse1.StaffNoIC

如果我将AND StDt BETWEEN '2011-1-1' AND '2011-12-31'用于[Date Condition],我会得到6个返回的结果。 但如果我使用AND StDt >= '2011-1-1' AND EndDt '2011-12-31'作为[Date Condition],我会得到7个返回的结果。 任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:7)

对于DATE类型,BETWEEN有点奇怪。您对日期类型的评价是

// These 2 are the same
BETWEEN '2011-01-01' AND '2011-12-31'
BETWEEN '2011-01-01 00:00:00' AND '2011-12-31 00:00:00'

所以它只匹配'2011-12-30 23:59:59',或者换另一种方式在DATE字段上它将不匹配'2011-12-30'。

当您搜索'2011-01-01'< = ....< ='2011-12-31'时,它会正确匹配日期=='2011-12-31'

所以你有4个选择。第一个是在上限添加1天。 这是我通常使用的选项 BETWEEN与日期列上的索引非常匹配,并且数据行上没有使用CAST或DATE(),因为ADDDATE('2011-12-31',1)只需要执行一旦

WHERE `StDt` BETWEEN '2011-01-01' AND ADDDATE('2011-12-31',1)

第二个是明确指定时间戳

WHERE `StDt`BETWEEN '2011-01-01 00:00:00' AND '2011-12-31 23:59:59'

正如您所发现的,第三个是使用< =和> =

WHERE `StDt` >= '2011-01-01' AND `StDt` <= '2011-12-31'

第四个选项似乎也可以使用,但我仍然更喜欢第一个方法,因为它是我认识的工作+不需要在每一行上使用CAST或DATE

WHERE DATE(`StDt`) BETWEEN DATE('2011-01-01') AND DATE('2011-12-31')

我希望这有帮助

答案 1 :(得分:1)

AND StDt BETWEEN '2011-1-1' AND '2011-12-31'

检查列StDt中的值是否在两个值之间。

AND StDt >= '2011-1-1' AND EndDt <= '2011-12-31'

检查StDt中的值是否为GTE值,值为EndDt是否为LTE值。

第一个使用仅一列的值,第二个使用两个值。所以他们会返回不同的结果,他们是不同的条件。如果StDt的值始终等于每行EndDt的值,那么他们唯一的方法是相同的。

要模仿您的第一个BETWEEN条款与GTE / LTE运营商的行为,您可以这样做:

AND StDt >= '2011-1-1' AND StDt <= '2011-12-31'

这应该返回相同的结果集。

答案 2 :(得分:0)

你可以在mysql

的参考资料上看到更多解释
  

为了将BETWEEN与日期或时间值一起使用时获得最佳结果,请使用CAST()将值显式转换为所需的数据类型。示例:如果将DATETIME与两个DATE值进行比较,请将DATE值转换为DATETIME值。如果在与DATE的比较中使用字符串常量(如“2001-1-1”),则将字符串强制转换为DATE。

我建议您继续使用&lt; =和&gt; =以获得更准确的结果