not fechas sql mysql between

fechas - sql between datetime



MySQL "entre" cláusula no inclusiva? (8)

Si ejecuto 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 de ''2011-01-01'' hasta ''2011-01-30''; omitiendo registros donde dob es ''2011-01-31''. ¿Alguien puede 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 seleccionada por los usuarios).


¿El campo al que hace referencia en su consulta es un tipo de fecha o un tipo de fecha y hora ?

Una causa común del comportamiento que describes es cuando utilizas un tipo de fecha y hora en el que realmente deberías estar usando 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 último día no se incluye en los resultados es la forma en que la consulta asume la porción de tiempo de las fechas que no especificó en su consulta.

Es decir: su consulta se interpretará como hasta la medianoche entre 2011-01-30 y 2011-01-31, pero los datos pueden tener un valor en algún momento más adelante en el día en 2011-01-31.

Sugerencia: cambie el campo al tipo Fecha si es un tipo Fecha y hora.


Del MySQL-manual :

Esto es equivalente a la expresión (min <= expr AND expr <= max)


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''


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.


Establezca la fecha superior a la fecha + 1 día, por lo que en su caso, configúrela a 2011-02-01.


Hola, esta consulta funciona para mí,

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''

Sorprendentemente, tales conversiones son soluciones a muchos problemas en MySQL.


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