MySql - Consultas sobre DATETIME

NeB1

Hola buenas, tengo un campo en formato DATETIME (me lo dan así, no puedo poner un timestamp) y quiero hacer una consulta del tipo "todos los registros, cuyas fechas están entre la hora 08:30:00 y la hora 14:40:00, sin importar el día que sea.

Había pensado en hacer algo así:

SELECT * FROM fichador WHERE ((HOUR( Time ) >=8 AND Minute( Time ) >30) AND ( HOUR( Time ) <14) AND Minute(Time)<40)

Pero claro, esto me saca solo horas cuyos minutos esten entre 30 y 40, por ejemplo, esa consulta me sacaría las siguientes filas:

8:31:00
8:32:00
9:35:22
10:32:10
11:34:54

y excluiria estas:

8:45:00
9:20:00

etc.

Alguien sabe alguna forma más correcta de trabajar con fechas para estos propositos?

eXtreM3

A golpe de vista... en el ejemplo que has puesto, tienes mal la consulta. Fíjate que primero estás selccionando las horas que sean mayores o iguales que 8 y los minutos que sean mayores que 30. Luego en la 2ª parte estás cogiendo las horas menores que 14 y los minutos menores que 40. Fíjate en los resultados que te devuelve y los que te excluye, ya verás como tiene toda la lógica.

SELECT * FROM fichador WHERE ((HOUR( Time ) >=8 AND Minute( Time ) >30) AND ( HOUR( Time ) <14) AND Minute(Time)<40)

Prueba con esta consulta:

SELECT * FROM fichador WHERE ((HOUR( Time ) >=8 AND HOUR( Time ) <14) AND ( Minute( Time ) >=30) AND Minute(Time)<40)

Digo yo que debería funcionar... si no es eso dilo y se buscan "métodos más pros" ;)

Elektr0_ddr

sin haberlo probado yo haría:

SELECT...
FROM...
WHERE TIME('campo') BETWEEN '08:30:00' AND '14:40:00'

Edit: 'campo' es tu campo de tipo datetime, no me gusta usar palabras susceptibles de estar reservadas como tu campo 'Time'

NeB1

#3 es que es un campo que genera automáticamente un aparato fichador.

#2 Si si, si he puesto ejemplos inventados, porque entiendo que es lo que me excluye, pero no sabía como enmendarlo, creo que #3 es la respuesta, no sabía que existía ese método.

Muchas gracias a los de todas formas ;)

dagavi

Aunque ya esté resuelto, un problema que veo en #1 es como juegas con los ANDs.

Lo que tu quieres hacer es:

Todas las horas entre 8 y 14
Y
Si la hora es 8 minuto > 30 O Si la hora es 14 minuto < 40 O hora != 8 y != 14

Por lo tanto:

    HORA >= 8 AND HORA <= 14
AND
    HORA == 8 AND MINUTO > 30
    OR
    HORA == 14 AND minuto < 40
    OR
    HORA > 8 AND HORA < 14

Sin embargo el AND de la izquierda al final se ve redundante por la última condición, así que se podría resumir en:

    HORA == 8 AND MINUTO > 30
    OR
    HORA == 14 AND MINUTO < 40
    OR
    HORA > 8 AND HORA < 14

Aunque si la sintaxis de #3 funciona pues muchísimo mejor, pero era solo por hacer el comentario xD

NeB1

#5 tienes razón, ahí he pecado de novato, no sé como me he calentado tanto la cabeza.

Por cierto, la sintaxis de #3 funciona a la perfección, no sé como no he encontrado la función BETWEEN en el manual de Mysql de su web. Estaba intentando apañarme a base de INTERVALS y TIMEDIFF pero vamos, esto es genial.

Muchas gracias ^^

http://bicicas.nosdom.com/fichador/index.php

Es una tonto-aplicación que estoy haciendo para un cliente/amigo, por si teneis curiosidad.

JuAn4k4

A lo mejor lo de between lo usa con los caracteres no ? porque los dos valores que le das para el between son cadenas . (Que no lo se eh).

Elektr0_ddr

el BETWEEN es lo mismo que poner TIME( 'Time' ) > '10:00:00' AND TIME( 'Time' ) < '11:00:00'
Supongo que al tener ese formato la cadena, lo interpretará como una hora.

NeB1

No sabía todas esas formas de trabajar con fechas, creía que las trataría como texto por eso las sacaba por partes!

Ya decía yo que no podía ser tan complicado... xD

Usuarios habituales

  • NeB1
  • Elektr0_ddr
  • JuAn4k4
  • dagavi
  • eXtreM3