Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

no entiendo select

Estas en el tema de no entiendo select en el foro de SQL Server en Foros del Web. saludos a todos y gracias de antemano por leer este post bueno les comento que estoy optimizando una intranet y me he topado con un ...
  #1 (permalink)  
Antiguo 16/05/2011, 11:55
Avatar de p414  
Fecha de Ingreso: agosto-2009
Ubicación: casi casi casi... a un lado de la cuna...
Mensajes: 575
Antigüedad: 14 años, 7 meses
Puntos: 44
no entiendo select

saludos a todos y gracias de antemano por leer este post

bueno les comento que estoy optimizando una intranet y me he topado con un pequeño problema, existe un lugar donde puedo reservar una sala de juntas con un horario definido y el tiempo que se requiere pero me he topado con este query el cual no entiendo bien

Código SQL:
Ver original
  1. SELECT * FROM Reservaciones WHERE Fecha = '20110516 00:00:00' AND id_sala='11' AND '16' BETWEEN datepart(hh,Hora_Inicio) AND datepart(hh,dateadd(MINUTE,(Duracion*60)-1,Hora_Inicio)) --

mi duda es para que sirve el '16' en este query :S no entiendo su funcionamiento :S todo lo demas no tengo problemas lo entiendo pero el fcking '16' para nada :S alguien puede ayudarme????

gracias y un saludo
  #2 (permalink)  
Antiguo 16/05/2011, 12:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: no entiendo select

ya probaste quitando el '16'? si tu query corre igual con el 16 o sin el entonces no sirve de nada :), creo que ese 16 esta haciendo lo mismo que where 1=1.

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 16/05/2011, 12:39
Avatar de p414  
Fecha de Ingreso: agosto-2009
Ubicación: casi casi casi... a un lado de la cuna...
Mensajes: 575
Antigüedad: 14 años, 7 meses
Puntos: 44
Respuesta: no entiendo select

gracias por responder libras pero si le quito el 16 me dice que hay un error en la clausula between ya vi para que me sirve, es para los datepart, busca la hora '16' entre las fechas-horas de la duracion con la hora de inicio

jejejeje muchas gracias libras :D
  #4 (permalink)  
Antiguo 16/05/2011, 12:55
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.
  #5 (permalink)  
Antiguo 16/05/2011, 13:10
Avatar de p414  
Fecha de Ingreso: agosto-2009
Ubicación: casi casi casi... a un lado de la cuna...
Mensajes: 575
Antigüedad: 14 años, 7 meses
Puntos: 44
Respuesta: no entiendo select

muchas gracias libras.. he entendido mejor como funciona este query y sobre las ofensas, mi ofensa es hacia el '16' no hacia algun usuario :S y pues te agradezco por el consejo tendre mas cuidado de ahora en adelante :)

gracias gracias :D
  #6 (permalink)  
Antiguo 16/05/2011, 13:36
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: no entiendo select

Hola de nuevo p414:

el que hizo el comentario sobre el tipo de lenguaje que hay que utilizar no fue el compañero libras, si no yo jejeje. Era obvio que el insulto era para la consulta (o para el '16' como lo mencionas), pero de cualquier manera hay que tener cuidado en cómo se escribe. Me alegra que lo que escribí te ayudara un poco a entender mejor la consulta.

Saludos
Leo.
  #7 (permalink)  
Antiguo 16/05/2011, 14:38
Avatar de p414  
Fecha de Ingreso: agosto-2009
Ubicación: casi casi casi... a un lado de la cuna...
Mensajes: 575
Antigüedad: 14 años, 7 meses
Puntos: 44
Respuesta: no entiendo select

jajajajajaja no habia visto eso jajajajajajaja como ya era la hora de la comida y no habia desayunado pues imaginate donde tengo las ideas xD
ajajajajajajaajajja q horror pero gracias de todos modos josue xDjajajajajajajajaja q cosas

Etiquetas: select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:08.