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个返回的结果。
任何建议都将不胜感激。
答案 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; =以获得更准确的结果