FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Como realizar consulta SQL para validar si un numero no forma parte de un rango
Saludos amigos, estoy implementando un sistema de Horarios para mi Facultad, ya casi esta todo hecho; estoy usando el componente TPlanner de TMS Component Pack para XE10, el detalle de los horarios los tengo en una tabla llamada horario_detalle la cual tiene la siguiente estructura:
Algunos datos de la tabla mencionada: El problema con todo sistema horarios es evitar que se asignen cursos que se crucen con otros previamente asignados y ese es el tema aqui, les explico: Lo que necesito es mejorar la consulta sql que estoy usando para validar los casos de cruce:
Muchas Gracias por su atencion |
#2
|
|||
|
|||
Te paso parte del wehere que usaba yo en su momento para validar algo similar a lo tuyo. Yo lo hacia por fechas pero se puede itilizar con cualquier tipo de datos numéricos.
Todo lo que comienza con 'in' lo debes reemplazar por lo que se ingresa desde tu aplicación. El resto son los campos de tu tabla. Analiza lo que te paso y cualquier duda consultas. Saludos, El Rayo PD: Si luego ven los administradores que esto le puede servir a muchos mas, lo pueden pasar como truco.
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno Última edición por elrayo76 fecha: 19-04-2016 a las 21:33:18. Razón: Corrección del SQL |
#3
|
|||
|
|||
Olvide comentar que lo que puse en el mensaje anterior va a reemplazar al BETWEEN, ya que este no valida si solo se superpone una parte del rango, luego lo demas puede quedar como esta. Además yo esto lo usaba en consultas de Oracle.
Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#4
|
|||
|
|||
Gracias amigo
Un caluroso saludo Rayo, mira puse en ejecución el código que me diste y sintácticamente funciona:
Aquí asumo que un horario nuevo se quiere instalar el iddia=1 (Martes) entre las horas 0 (7:00am) a 2 (9:00am) cuando Ya existe un horario asignado a esa hora, y si, efectivamente arroja el id_horariodet correspondiente al horario asignado, pero que pasa si alguien quiere instalar un horario en iddia=1 entre las horas 1 (8:00am) y 3 (10:00am) donde existe cruce igualmente? Saludos y Gracias |
#5
|
||||
|
||||
Curiosamente un motor sql deberia hacer esto super simple (ya que esto es manejo basico de relaciones), pero desafortunadamente todo depende de las abilidades programaticas de cada motor.
Esta es la forma basica (ej en python): Código PHP:
Y de ahi usas sql estandar para la interseccion
__________________
El malabarista. |
#6
|
|||
|
|||
Amigo darkamerico, te comento lo que hace lo que puse en el SQL.
1) Mira que no se crucen los datos estando los valores ingresados fuera de los rangos existentes o sean iguales a los límites. 2) Mira que no se crucen los datos estando los valores ingresados dentro del rango existente. 3) Mira que el rango tenga el desde dentro del rango existente pero el hasta puede estar dentro o fuera 4) Lo mismo que el anterior pero alrevez, el desde puede estar fuera pero el hasta dentro. Pongo ejemplo con tu caso Inicio = 2 / Fin = 4 Ingresan: Inicio = 1 / Fin = 5 --> Primera validacion de mi SQL Inicio = 2 / Fin = 5 --> Segunda validacion de mi SQL Inicio = 2 / Fin = 4 --> Tercera validacion de mi SQL Inicio = 1 / Fin = 4 --> Cuarta Validacion de mi SQL Con este ejemplo creo que te debería quedar mas claro porque todas esas validaciones. Creeme que fue analizado mucho de hacerlo asi por tema de performance y no hay otra forma de hacerlo. mamcx, como haces en tu código para validar si solo el inicio esta dentro del rango y el fin esta fuera o viceversa?. Por lo que entendi no lo puede hacer, dime si me equivoco. Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#7
|
||||
|
||||
Lo que digo es que si se el motor que usa puede generar fechas en memoria puede usar sql estandar para hacer el chequeo. Osea, es armar una tabla en memoria con registros como:
Cita:
__________________
El malabarista. |
#8
|
|||
|
|||
Una observacion final
La consulta implementada quedó como sigue:
Solo una observacion final: Si Existe un horario de hora=0 (7:00am) a hora=2 (9:00am) y quiero asignar un horario nuevo de 9:00am a 11:00am no me permite. Un abrazo |
#9
|
|||
|
|||
Porque no te deja asignar el horario que quieres?. No se que es lo que te está devolviendo la consulta completa que pusiste.
Igualmente fijate que te equivocaste en un dato de la consulta. Te pongo tal cual como debes copiarla y pegarla.
Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#10
|
|||
|
|||
Omg!
Grande Rayo, la cosa funcionó!!!!
|
#11
|
|||
|
|||
Fue un gusto haberte ayudado, ya que a mi me han ayudado muchas veces.
Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Cómo escribir un número de forma exponencial? | soammm | Varios | 1 | 29-10-2012 14:40:34 |
No se como realizar esta consulta | minos | SQL | 2 | 01-10-2004 23:08:37 |
como buscar dentro de una consulta un texto que sea parte de la descripcion | viajero2015 | Conexión con bases de datos | 1 | 15-11-2003 05:18:09 |
Como realizar esta Consulta en SQL | Jose Manuel | SQL | 3 | 11-10-2003 16:01:02 |
|