MySQL“之间”的条款不包括在内?

如果我使用between子句运行查询,它似乎排除结束值。
例如:

 select * from person where dob between '2011-01-01' and '2011-01-31' 

这从“2011-01-01”到“2011-01-30”获得了dob所有结果; 跳过loggingdob是“2011-01-31”的logging。 任何人都可以解释为什么这个查询的行为是这样的,我怎么可以修改它包括logging,其中dob是'2011-01-31'? (因为用户已经select了结束date而不加1)。

该领域dob可能有一个时间组件。

截断它:

 select * from person where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31' 

从MySQL手册 :

这相当于expression式(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' 

您在查询中引用的字段是datetypes还是date时间types?

您所描述的行为的一个常见原因是当您使用DateTimetypes时,您确实应该使用Datetypes。 也就是说,除非你真的需要知道什么时候出生,只要使用datetypes即可。

最后一天没有被包含在结果中的原因是查询假定您在查询中未指定date的时间部分。

即:您的查询在2011-01-30和2011-01-31之间被解释为午夜,但是数据可能在2011-01-31当天晚些时候有一个值。

build议:如果是DateTimetypes,则将该字段更改为Datetypes。

嗨这个查询适合我,

 select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59' 
 select * from person where DATE(dob) between '2011-01-01' and '2011-01-31' 

令人惊讶的是,这种转换是MySQL中许多问题的解决scheme。

设置较高的date到date+ 1天,所以在你的情况下,将其设置为2011-02-01。