MySQL - Time

   
Vista:

Time

Publicado por Sinpery (3 intervenciones) el 16/06/2015 03:13:14
Buenas, soy nuevo por aquí. Tengo un problema el cual os comento: Tengo una base de datos con 2 tablas. Una para alumnos y sus datos personales (dni, nombre, apellidos, etc) y otra para clases (claseid, dni_alumno, fecha_clase, hora_inicio y hora_fin).

A la hora de insertar, modificar, eliminar o consultar los datos de un alumno, no he tenido problema. Pero a la hora de tratar el tema de clases tengo varias dudas sobre todo con el tema de las horas.

La idea es crear una base de datos con mis alumnos y mis clases particulares, de modo que solo tenga un alumno a unas determinadas horas y no pueda haber varios. Insertar los datos y almacenarlos en la tabla no me da errores pero si estoy teniendo problemas en cuanto a su validación.

1º Las clases no tienen tiempo definido, me explico, tienen una hora_inicio y hora_fin pero no tienen un tiempo determinado por norma. Unas clases pueden durar 1 hora, otras hora y media etc.

2º A la hora de comparar una fecha concreta con una hora determinada de inicio y de fin no tengo problemas siempre y cuando la hora que se insertó fuera la misma que esos campos. Es decir. Si el 17/06/2015 inserto un alumno de 10:00 a 11:00 y luego intento insertar otro con esa fecha y con esas horas, no me deja me valida bien.

3º El problema principal viene cuando se solapan las horas y no se como tratarlo la verdad, es decir si como el ejemplo anterior tengo ese registro, pero ahora intento añadir un alumno el 17/06/2015 de 10:30 a 11:30 también lo acepta y es precisamente lo que pretendo evitar ya que ese intervalo de hora está ocupado.

Cualquier aportación se agradece. Un saludo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Time

Publicado por Rafael (57 intervenciones) el 16/06/2015 14:50:08
Hola:

Espero entenderte correctamente y si no lo que te diga te ayude:

Supondre que tienes una tabla con los siguientes datos:
1
2
3
4
5
6
===============================================================
| claseid | dni_alumno | fecha_clase | hora_inicio | hora_fin |
===============================================================
|       1 | 12345678A  |  16/06/2015 |    10:00:00 | 11:00:00 |
|       2 | 12345678B  |  16/06/2015 |    12:00:00 | 13:00:00 |
===============================================================

Para la misma suposicion pensare que la hora de incio y fin son del tipo time

Caso 1: Introducir una nueva cita que vaya de las 11:01:00 a las 11:59:00 sabemos que sera correcta.

Caso 2: Introducir una nueva cita que vaya de las 10:30:00 a las 11:59:00 sabemos que es incorrecta.

Caso 3: Introducir una nueva cita que vaya de las 11:00:00 a las 12:30:00 sabemos que es incorrecta.

Caso 4: Introducir una nueva cita que vaya de las 10:30:00 a las 12:30:00 sabemos que es incorrecta.

Asi pues para cumplir los 4 casos en un solo paso podemos usar esta querie
1
2
3
4
SELECT COUNT(*)
FROM   CLASE
WHERE  NUEVO_INICIO BETWEEN HORA_INICIO AND HORA_FIN
OR     NUEVO_FIN    BETWEEN HORA_INICIO AND HORA_FIN

De tal modo que
En el caso 1 el resultado deberia ser 0 es decir que no tienes citas y por lo tanto correcto.
En el resto de los casos 1 lo cual te indicaria que es falso...

Con esta validacion previa deberias de poder avanzar...

Saludos, ya nos contaras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Time

Publicado por Sinpery (3 intervenciones) el 16/06/2015 15:24:31
Rafael, muchas gracias por ayudar!

Si, los campos hora los trato con time y el campo fecha como date. Al aplicar una función de validación en PHP, realizaba una consulta a la BD cuyo resultado era 0 ó 1, si existía o no esa fecha con esa hora_inicio y esa hora_fin en concreto:

"SELECT count(*) as total FROM clase
WHERE fecha_clase ='$fecha_clase'
AND hora_inicio='$hora_inicio'
AND hora_fin='$hora_fin'");

La sentencia funciona que has aportado era justo la que necesitaba, funciona perfectamente por lo que he podido comprobar, y ahora me surge otra duda:

Supongo que cuando ya existe una hora_inicio y hora_fin en la tabla tal como por ej: 10:00 - 12:00, a la hora de insertar un nuevo registro que fuera de 12:00 a 13:00, la hora_inicio debe ser 12:01 como mínimo.

¿Se podría aplicar alguna cláusula a la sentencia BETWEEN tal que dejara coger la hora_fin como inicio en un nuevo registro?

Es decir, existiendo ya 10:00 a 12:00 en la BD como hora_inicio - hora_fin, que el siguiente registro permitiera coger la hora de 12:00 a X, pero nunca de 11:59, ya que es anterior a 12:00

No se si me he explicado bien, pero sería algo así como utilizar operadores con BETWEEN.

Aún así es algo totalmente opcional, ya que el principal problema está resuelto.

Muchas gracias de nuevo. Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Time

Publicado por Sinpery (3 intervenciones) el 16/06/2015 16:17:53
Por si a alguien le puede ayudar también, corrijo un pequeño error de la solución anterior, que acabo de verificar.
La solución es válida siempre y cuando sea siempre la misma fecha, pero yo como el campo fecha_clase lo trato aparte de hora_inicio y hora_fin, debo aplicar una condición más a la sentencia

"SELECT COUNT(*) as total FROM clase
WHERE '$fecha_clase' = fecha_clase
AND '$hora_inicio' BETWEEN hora_inicio AND hora_fin
OR '$hora_fin' BETWEEN hora_inicio AND hora_fin");

En este ejemplo. Si intento insertar fecha_clase = 17/06/2015, hora_inicio = 10:00:00, hora_fin = 11:00:00. No me deja
ya que esas horas ya están registradas en mi BD. El error lógicamente, es que se trata de un día diferente, con lo cual sí que debería dejar insertarlas.

===============================================================
| claseid | dni_alumno | fecha_clase | hora_inicio | hora_fin |
===============================================================
| 1 | 12345678A | 16/06/2015 | 10:00:00 | 11:00:00 |
| 2 | 12345678B | 16/06/2015 | 12:00:00 | 13:00:00 |
===============================================================
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar