MySQL“ between”子句不包含?

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

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

这将获得 dob从“2011-01-01”到“2011-01-30”的所有结果; 跳过 dob为“2011-01-31”的记录。有人能解释一下为什么这个查询会这样,以及我如何修改它以包含 dob为“2011-01-31”的记录吗?(不会在结束日期后面加上1,因为它是由用户选择的。)

140024 次浏览

将上面的日期设置为 date + 1 day,因此在您的情况下,将其设置为2011-02-01。

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

来自 MySQL-手册:

这等效于表达式 (min < = expr AND expr < = max)

在查询中引用的字段是 日期类型还是 日期时间类型?

您所描述的行为的一个常见原因是当您使用 DateTime 类型时,实际上应该使用 Date 类型。也就是说,除非您确实需要知道某人的出生时间,否则只需使用 Date 类型。

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

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

建议: 如果字段是 DateTime 类型,则将该字段更改为 Date 类型。

问题是2011-01-31真的是2011-01-3100:00:00:00。这是一天的开始。白天的一切都不包括在内。

字段 dob可能有时间成分。

把它截断:

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

令人惊讶的是,这样的转换可以解决 MySQL 中的许多问题。

嗨,这个问题对我很有用,

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)的东西,所以要小心!

在 MySql 中,两个值之间是包含的,因此当您尝试获取“2011-01-01”和“2011-01-31”之间的值时,这两个值之间是包含的

它将包括从 2011-01-01 00:00:002011-01-31 00:00:00 因此,2011年1月31日以来,实际上没有任何事情应该从 2011-01-31 00:00:00 ~ 2011-01-31 23:59:59开始

对于上限,您可以改为 2011-02-01,然后它将获得所有数据到 2011-01-31 23:59:59

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

加上 or <<column>> like "date%"