Sobre asignacion horaria de recursos

25/08/2003 - 18:19 por Carlos A. Díaz | Informe spam
Hola, desearia que alguno me pueda ayudar con mi problema.

Tengo almacenado en una tabla rangos de horas (Desde y Hasta) y desearia
consultar si un rango nuevo no se encuentra dentro de los que ya tengo
asignado. Ej.

Almacenado:
07:00 12:00
13:00 17:00

Consultar si puedo agregar: de (15:00 a 16:00) o (06:00 a 13:00)

Es para asignacion de recursos y que estos no se sobrepongan con
asignaciones anteriores

Muchas Gracias

Preguntas similare

Leer las respuestas

#1 Javier Loria\(MVP\)
26/08/2003 - 17:33 | Informe spam
Hola Carlos:
El manejo de horarios por rangos puede ser por problemas de logica un
poco "especial". Si asumimos que es ocupado y no ocupado. Tenemos
las siguientes posiblidades de conflicto, que diagramamos asi:
Valor Original: ++-
Caso a: --+==+-
Caso b: -+==+--
Caso c: +==+
Caso d: -+==+--
Para expresarlo como condiciones de WHERE deberiamos tener lo siguiente:
Caso a: WHERE Original.Desde>=Nuevo.Desde AND Original.Hasta>=Nuevo.Hasta
AND Original.Desde<=Nuevo.Hasta
Caso b: WHERE Original.Desde<=Nuevo.Desde AND Original.Hasta<=Nuevo.Hasta
AND Original.Hasta<=Original.Nuevo
Caso c: WHERE Original.Desde<=Nuevo.Desde AND Original.Hasta>=Nuevo.Hasta
Caso d: WHERE Original.Desde>=Nuevo.Desde AND Original.Hasta<=Nuevo.Hasta

Es claro que una expresion con una combinacion de los 4 casos anteriores es
compleja. Una forma mas apropiada seria buscar no los que chocan sino los
casos que no chocan:
Valor Original: -+=+--
Caso e: -++-
Caso f: --++
Para expresarlo como condiciones de WHERE deberiamos tener lo siguiente:
Caso f: WHERE Original.Desde<=Nuevo.Hasta
Caso g: WHERE Original.Hasta>=Nuevo.Desde

Traduciendo esto a SQL podriamos hacer lo siguiente:
/* Inicio de Codigo */
/* Creacion de Tabla */
CREATE TABLE HorariosAsignados(
NumeroHorario INT NOT NULL PRIMARY KEY,
Desde SMALLDATETIME NOT NULL,
Hasta SMALLDATETIME NOT NULL,
CONSTRAINT CH_HorarioDesdeHasta CHECK(Desde<Hasta)
)

INSERT HorariosAsignados
VALUES(1, '2003-08-25T08:00:00', '2003-08-25T10:00:00')

INSERT HorariosAsignados
VALUES(2, '2003-08-25T12:00:00', '2003-08-25T14:00:00')
/* Fin de Codigo */

Un SELECT como el que sigue me indica los horarios que NO CHOCAN:
SELECT *
FROM HorariosAsignados
WHERE (Hasta<=@Desde OR Desde>=@Hasta)
y uno como el que sigue indica los que SI CHOCAN:

SELECT *
FROM HorariosAsignados
WHERE NOT (Hasta<=@Desde OR Desde>=@Hasta)

La logina inversa preguntar por el NOT hace mas sencillo el codigo y con
este ultimo podrias crear un procedimiento que revise al momento de la
insercion si el valor cumple las condiciones o no.

Espero te sirva,



Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Carlos A. Díaz escribio:
Hola, desearia que alguno me pueda ayudar con mi problema.

Tengo almacenado en una tabla rangos de horas (Desde y Hasta) y
desearia consultar si un rango nuevo no se encuentra dentro de los
que ya tengo asignado. Ej.

Almacenado:
07:00 12:00
13:00 17:00

Consultar si puedo agregar: de (15:00 a 16:00) o (06:00 a 13:00)

Es para asignacion de recursos y que estos no se sobrepongan con
asignaciones anteriores

Muchas Gracias
Respuesta Responder a este mensaje
#2 Carlos A. Díaz
26/08/2003 - 22:40 | Informe spam
Javier: primero muchas gracias por responder y segundo por ser tan explicito
en tu respuesta. Analizaré tu opcion.

Saludos

Carlos

"Javier Loria(MVP)" escribió en el mensaje
news:#huTyd#
Hola Carlos:
El manejo de horarios por rangos puede ser por problemas de logica un
poco "especial". Si asumimos que es ocupado y no ocupado. Tenemos
las siguientes posiblidades de conflicto, que diagramamos asi:
Valor Original: ++-
Caso a: --+==+-
Caso b: -+==+--
Caso c: +==+
Caso d: -+==+--
Para expresarlo como condiciones de WHERE deberiamos tener lo siguiente:
Caso a: WHERE Original.Desde>=Nuevo.Desde AND Original.Hasta>=Nuevo.Hasta
AND Original.Desde<=Nuevo.Hasta
Caso b: WHERE Original.Desde<=Nuevo.Desde AND Original.Hasta<=Nuevo.Hasta
AND Original.Hasta<=Original.Nuevo
Caso c: WHERE Original.Desde<=Nuevo.Desde AND Original.Hasta>=Nuevo.Hasta
Caso d: WHERE Original.Desde>=Nuevo.Desde AND Original.Hasta<=Nuevo.Hasta

Es claro que una expresion con una combinacion de los 4 casos anteriores


es
compleja. Una forma mas apropiada seria buscar no los que chocan sino los
casos que no chocan:
Valor Original: -+=+--
Caso e: -++-
Caso f: --++
Para expresarlo como condiciones de WHERE deberiamos tener lo siguiente:
Caso f: WHERE Original.Desde<=Nuevo.Hasta
Caso g: WHERE Original.Hasta>=Nuevo.Desde

Traduciendo esto a SQL podriamos hacer lo siguiente:
/* Inicio de Codigo */
/* Creacion de Tabla */
CREATE TABLE HorariosAsignados(
NumeroHorario INT NOT NULL PRIMARY KEY,
Desde SMALLDATETIME NOT NULL,
Hasta SMALLDATETIME NOT NULL,
CONSTRAINT CH_HorarioDesdeHasta CHECK(Desde<Hasta)
)

INSERT HorariosAsignados
VALUES(1, '2003-08-25T08:00:00', '2003-08-25T10:00:00')

INSERT HorariosAsignados
VALUES(2, '2003-08-25T12:00:00', '2003-08-25T14:00:00')
/* Fin de Codigo */

Un SELECT como el que sigue me indica los horarios que NO CHOCAN:
SELECT *
FROM HorariosAsignados
WHERE (Hasta<=@Desde OR Desde>=@Hasta)
y uno como el que sigue indica los que SI CHOCAN:

SELECT *
FROM HorariosAsignados
WHERE NOT (Hasta<=@Desde OR Desde>=@Hasta)

La logina inversa preguntar por el NOT hace mas sencillo el codigo y con
este ultimo podrias crear un procedimiento que revise al momento de la
insercion si el valor cumple las condiciones o no.

Espero te sirva,



Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Carlos A. Díaz escribio:
> Hola, desearia que alguno me pueda ayudar con mi problema.
>
> Tengo almacenado en una tabla rangos de horas (Desde y Hasta) y
> desearia consultar si un rango nuevo no se encuentra dentro de los
> que ya tengo asignado. Ej.
>
> Almacenado:
> 07:00 12:00
> 13:00 17:00
>
> Consultar si puedo agregar: de (15:00 a 16:00) o (06:00 a 13:00)
>
> Es para asignacion de recursos y que estos no se sobrepongan con
> asignaciones anteriores
>
> Muchas Gracias



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida