SQL Consulta seleccionando entre dos fechas
Pregunta
Quiero seleccionar registros entre dos fechas: una fecha de inicio y una data final (son formatos de fecha/hora en SQL). Tengo la siguiente consulta SQL pero no funciona, ¿alguien podría decirme qué estoy haciendo mal?
"SELECT *
FROM house
WHERE startDate >= '2012/02/22 00:00:00' AND endDate <= '2012-02-25 00:00:00'"
Solución
Sugeriría convertir las fechas a una fecha y hora y compararlas, así como mantener la fecha estándar y consistente. Algo como:
"SELECT *
FROM house
WHERE DATE(startDate) >= DATE('2012-02-22 00:00:00')
AND DATE(endDate) <= DATE('2012-02-25 00:00:00')"
NOTA: Asumí que su fecha de inicio y la fecha final eran del mismo formato que las cadenas que su provisión.
Otros consejos
¿Quieres todas las filas que startDate
es '2012-02-22'
o más tarde y endDate
es '2012-02-22'
o anterior? Entonces, usa esto:
SELECT *
FROM house
WHERE startDate >= '2012-02-22'
AND endDate < '2012-02-26' --- notice the `<`, not `<=`
--- and the `day+1`
Al usar fechas con productos SQL, use mejor este formato en consultas y declaraciones: '20120222'
O esto (que me parece más fácil de leer: '2012-02-22'
.
Usando barras como '2012/02/22'
o cualquier otro orden que Year-Month-Day
no es recomendado.
No hay necesidad de incluir la parte de tiempo. '2012-02-22 00:00:00'
es lo mismo que '2012-02-22'
.
Usando endDate <= '2012-02-25 00:00:00'
significa que cualquier fila con fecha 25 de febrero de 2012 pero hora después de la medianoche ('00:00:00'
) no coincidirá con la condición. Si quieres esas filas también, usa endDate < '2012-02-26'
en cambio.
Podrías usar DATE(endDate) <= DATE('2012-02-25 00:00:00')
o DATE(endDate) <= '2012-02-25'
Pero estas condiciones son "no sargables", por lo que sus consultas no podrán usar un índice en endDate
.
Está el construido STR_TO_DATE
función en mysql que toma la misma máscara de formato que formato de fecha.
start_date >= str_to_date('2012/02/22 00:00:00','%Y/%m/%d %h:%i:%s)