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

Jam*_*mie 0 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
Run Code Online (Sandbox Code Playgroud)

如果我用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返回的结果.任何建议将不胜感激.

Sim*_*tal 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'
Run Code Online (Sandbox Code Playgroud)

所以它只匹配'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)
Run Code Online (Sandbox Code Playgroud)

第二种是明确指定时间戳

WHERE `StDt`BETWEEN '2011-01-01 00:00:00' AND '2011-12-31 23:59:59'
Run Code Online (Sandbox Code Playgroud)

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

WHERE `StDt` >= '2011-01-01' AND `StDt` <= '2011-12-31'
Run Code Online (Sandbox Code Playgroud)

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

WHERE DATE(`StDt`) BETWEEN DATE('2011-01-01') AND DATE('2011-12-31')
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助

  • @Jamie,是的约会日期......我实际上会把结束日期加上1天并保证不到,所以整个前一天都会被完全包括在内...... <2012-01-01(这是一样的)如西蒙所述,2011-12-31 23:59:59) (2认同)