Ver Mensaje Individual
  #4 (permalink)  
Antiguo 16/05/2011, 12:55
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: no entiendo select

Hola p414:

La verdad está bastante rara la consulta, El '16' formaría parte de la condición Between que estás armando:

Código:
'16' BETWEEN 
datepart(hh,Hora_Inicio) AND 
datepart(hh,dateadd(MINUTE,(Duracion*60)-1,Hora_Inicio))
La primera parte del between estaría extrayendo la hora de inicio. La segunda parte del Between, hace uso del campo DURACION (me imagino que existe también en tu tabla reservaciones) que corresponde al número de horas que va a durar la junta. por lo tanto, con este dato y la fecha de inicio obtiene la hora de fin de la junta .

De tal manera que la traducción de la condición sería:

"todas aquellas juntas cuyo desarrollo ocurra entre las 16 horas"

supongamos que tienes en tu tabla las siguientes reservaciones

Código:
id|hora_inicio|duracion
---------------------------------------
1|2011-05-16 15:00:00|1
2|2011-05-16 15:00:00|2
3|2011-05-16 16:00:00|1
4|2011-05-16 17:00:00|1
es decir, tienes una reservación a las 3pm y dura 1 hora, una reservación a las 4 pm y dura dos horas, una reservación a las 4pm y dura 1 hora y una reservación a las 5pm y dura 1 hora

ahora buen, para calcular la hora de término lo que hace la consulta es multiplicar la duración por 60 y restarle 1, para obtener el número de minutos, por lo tanto la hora de termino para cada reservación quedaría como:


Código:
id|hora_inicio|solo_hora_inicio|hora_fin|solo_hora_fin
------------------------------------------------------------------------
1|2011-05-16 15:00:00.000|15|2011-05-16 15:59:00.000|15
2|2011-05-16 15:00:00.000|15|2011-05-16 16:59:00.000|16
3|2011-05-16 16:00:00.000|16|2011-05-16 18:59:00.000|18
4|2011-05-16 17:00:00.000|17|2011-05-16 17:59:00.000|17
con esta tabla se observa que sólo las juntas con id's 2 y 3 se llevan a cabo alrededor de las 4 de la tarde. Te dejo un script donde se ve más o menos el comportamiento de la consulta según lo que pude entender.

Código SQL:
Ver original
  1. DECLARE @reservaciones TABLE (id INT, hora_inicio datetime, duracion INT)
  2. INSERT INTO @reservaciones VALUES (1, '2011-05-16 15:00:00', 1)
  3. INSERT INTO @reservaciones VALUES (2, '2011-05-16 15:00:00', 2)
  4. INSERT INTO @reservaciones VALUES (3, '2011-05-16 16:00:00', 3)
  5. INSERT INTO @reservaciones VALUES (4, '2011-05-16 17:00:00', 1)
  6.  
  7. SELECT id,
  8. hora_inicio,
  9. datepart(hh,hora_Inicio) solo_hora_inicio,
  10. dateadd(MINUTE,(Duracion*60)-1,Hora_Inicio) hora_fin,
  11. datepart(hh,dateadd(MINUTE,(Duracion*60)-1,Hora_Inicio)) solo_hora_fin
  12. FROM @reservaciones
  13.  
  14. SELECT * FROM @reservaciones WHERE
  15. '16' BETWEEN datepart(hh,hora_Inicio) AND
  16. datepart(hh,dateadd(MINUTE,(Duracion*60)-1,Hora_Inicio))

Finalmente dos observaciones, primero: la consulta está mezclando tipos de datos, por un lado el 16 lo pone como cadena, sin embargo datepart regresa un entero, por lo tanto se realiza una conversión implícita antes de hacer la comparación.

segundo, por favor NO UTILICES PALABRAS CON OFENSAS no importa que sean en inglés o en cualquier otro lenguaje diferente al español. los foristas no tenemos la culpa de tu grado de frustación. Yo estuve tentado a no responder este post por ese detalle. OJO CON ESO.

Código:
EDITADO: me tardé tanto en escribir tanto rollo que no vi que ya habías resuelto el problema jejeje. Saludos 
Saludos y espero que pronto resuelvas tu problema.
Leo.