Answers:
该字段dob
可能具有时间成分。
截断它:
select * from person
where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'
CAST(dob AS DATE)
您可以使用更简洁DATE(dob)
。
>=
和<
代替会获得更好的性能between
。
dob BETWEEN '2011-01-01 00:00:00' AND '2011-01-31 23:59:59
。这是因为DATE(dob)
必须为每一行计算一个值,并且不能在该字段上使用任何索引。
t > 23:59:59 and t < 24:00:00
。为什么要处理BETWEEN
所有指定不当的问题?而是遵循David的建议和使用:WHERE dob >= '2011-01-01' AND dob < '2011-02-01'
。最佳性能,并且每次都有效。
从MySQL手册:
这等效于表达式(min <= expr AND expr <= max)
问题是2011-01-31确实是2011-01-31 00:00:00。那是一天的开始。白天的一切都不包括在内。
select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'
2011-01-31 23:59:59
但将包括直到2011-01-31 23:59:58
一天的最后一秒的日期,这可能很小,但是会有人从中受益。
23:59:59
结果中也包括。因此,这两种方式都具有包容性。
dob
列是具有亚秒精度的时间戳,那么BETWEEN
除非使用'2011-02-01 00:00:00'代替,否则仍不会错过当天最后一秒内的事件吗?
2011-01-31 23:59:59.003
。@氮气使用2011-02-01 000:00:00
将在2月1日错误地包含零时间...。这就是原因>=
,<
应改为使用。
您好,此查询对我有用,
select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
您可以通过以下方式运行查询:
select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
就像其他人指出的那样,如果您的日期是硬编码的。
另一方面,如果日期在另一个表中,则可以添加一天并减去一天(如果保存的日期没有秒/时间),例如:
select * from person JOIN some_table ... where dob between some_table.initial_date and (some_table.final_date + INTERVAL 1 DAY - INTERVAL 1 SECOND)
避免对dob
字段进行强制转换(例如在接受的答案中),因为这可能会导致巨大的性能问题(例如dob
,假设存在一个无法在字段中使用索引)。执行计划可能会改变从using index condition
到using where
,如果你做的东西像DATE(dob)
或者CAST(dob AS DATE)
,所以一定要小心!
BETWEEN
包含两个值。我MySQL Server 5.7
在Windows 10