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返回的结果.任何建议将不胜感激.
对于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)
我希望这有帮助