¿La cláusula "entre" de MySQL no es inclusiva?


Si corro una consulta con una cláusula between, parece excluir el valor final.
Por ejemplo:

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

Esto obtiene todos los resultados con dob desde '2011-01-01' hasta '2011-01-30'; omitiendo registros donde dob es '2011-01-31'. ¿Puede alguien explicar por qué esta consulta se comporta de esta manera, y cómo podría modificarla para incluir registros donde dob es '2011-01-31'? (sin agregar 1 a la fecha de finalización porque ha sido seleccionado por los usuarios.)

Author: ROMANIA_engineer, 2011-02-22

8 answers

El campo dob probablemente tiene un componente de tiempo.

Para truncarlo:

select * from person 
where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'
 146
Author: tiago2014,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-30 16:24:36

Del MySQL-manual :

Esto es equivalente a la expresión (min

 252
Author: Frank Heikens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-22 16:30:57

El problema es que 2011-01-31 realmente es 2011-01-31 00:00:00. Ese es el comienzo del día. Todo durante el día no está incluido.

 79
Author: Daniel Hilgarth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-22 16:35:13
select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'
 27
Author: Gaurav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-22 16:30:42

¿El campo al que hace referencia en su consulta es un tipo Date o un tipo DateTime?

Una causa común del comportamiento que describe es cuando usa un tipo de fecha y hora donde realmente debería usar un tipo de fecha. Es decir, a menos que realmente necesite saber a qué hora nació alguien, simplemente use el tipo de fecha.

La razón por la que el día final no se incluye en sus resultados es la forma en que la consulta asume la porción de tiempo de las fechas que no especificó en su consulta.

Esto es: Su consulta se interpreta como hasta la medianoche entre 2011-01-30 y 2011-01-31, pero los datos pueden tener un valor más tarde en el día 2011-01-31.

Sugerencia: Cambie el campo al tipo Date si es un tipo DateTime.

 5
Author: JohnFx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-22 16:34:59

Hola esta consulta funciona para mí,

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
 4
Author: infinito84,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-29 11:40:04
select * from person where DATE(dob) between '2011-01-01' and '2011-01-31'

Sorprendentemente tales conversiones son soluciones a muchos problemas en MySQL.

 1
Author: betty.88,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-14 12:22:42

Establezca la fecha superior en fecha + 1 día, por lo que en su caso, establézcala en 2011-02-01.

 0
Author: Rafal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-22 16:26:52