MySQL"之间"条款不包含?

ASD*_*ASD 137 mysql sql between

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

select * from person where dob between '2011-01-01' and '2011-01-31'
Run Code Online (Sandbox Code Playgroud)

dob将从'2011-01-01'到'2011-01-30' 获得所有结果; 跳过记录在哪里dob'2011-01-31'.任何人都可以解释为什么这个查询的行为方式,以及我如何修改它以包含记录dob'2011-01-31'?(不添加1到结束日期,因为它已被用户选中.)

Fra*_*ens 292

MySQL手册:

这相当于表达式(min <= expr AND expr <= max)

  • 总之**之间是包容性的**...这就是为什么这个答案摇滚. (25认同)
  • 旧评论,但我想将此与特定查询联系起来."BETWEEN"包含在内,但是没有指定时间的日期填充到00:00:00.因此,比较日期范围将失去最后一天.可以调用DATE(dob)或指定当天结束. (6认同)
  • 不知道为什么这不是最佳答案,因为它直接来自手册...... (4认同)
  • 本答案中链接的手册显示,在比较DATE和DATETIME对象时,首选投射.所以我认为@tiagoinu在最严格的意义上有最完整的答案,但两者都是现货. (3认同)

tia*_*014 168

该字段dob可能具有时间组件.

截断它:

select * from person 
where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'
Run Code Online (Sandbox Code Playgroud)

  • 使用`dob BETWEEN'2011-01-01 00:00:00'EN'2011-01-31 23:59:59`将获得更好的表现.这是因为`DATE(dob)`必须为每一行计算一个值,并且不能使用该字段上的任何索引. (106认同)
  • 而不是`CAST(dob AS DATE)`你可以使用更简洁的`DATE(dob)`. (52认同)
  • 虽然这有效,但使用`> =`和`<`代替`between`可以获得更好的性能. (9认同)
  • @joshuahedlund请用此解决方案添加答案.CAST效率不高. (2认同)
  • @joshuahedlund这有效,直到你有时间为t> 23:59:59且t <24:00:00`的数据.为什么要处理指定不佳的`BETWEEN`?而是遵循大卫的建议并使用:`WHERE dob> ='2011-01-01'ANDb <'2011-02-01'`.性能最佳,每次都有效. (2认同)

Dan*_*rth 94

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

  • 这真的解释了发生了什么并回答了这个问题. (17认同)
  • 经过这么多年,这个答案仍然是最好的.非常感谢. (2认同)

Gau*_*rav 30

select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'
Run Code Online (Sandbox Code Playgroud)

  • 如果`dob`列是具有亚秒精度的时间戳,那么除非使用'2011-02-01 00:00:00',否则不会'BETWEEN`仍然会在当天的最后一秒内错过事件? (2认同)
  • -1. 不包括`2011-01-31 23:59:59.003`。@nitrogen 使用 `2011-02-01 000:00:00` 将_不正确地_包括 2 月 1 日的零时间......这就是为什么应该使用 `&gt;=` 和 `&lt;`。 (2认同)

Joh*_*nFx 6

您在查询中引用的字段是Date类型还是DateTime类型?

您描述的行为的常见原因是当您使用DateTime类型时,您应该使用Date类型.也就是说,除非你真的需要知道某人出生的时间,否则只需使用日期类型即可.

最后一天未包含在结果中的原因是查询假定您未在查询中指定的日期的时间部分的方式.

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

建议:如果字段是DateTime类型,请将字段更改为Date类型.


小智 6

嗨,这个查询对我有用,

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
Run Code Online (Sandbox Code Playgroud)