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

Sql server select que busca rango de fechas y horas

Estas en el tema de Sql server select que busca rango de fechas y horas en el foro de SQL Server en Foros del Web. Hola a todos: Soy nuevo en este foro, espero puedan ayudarme. Sin mas que decir ire al grano. Quisiera crear una sentencia sql, la cual ...
  #1 (permalink)  
Antiguo 19/08/2011, 02:06
 
Fecha de Ingreso: diciembre-2010
Mensajes: 7
Antigüedad: 13 años, 3 meses
Puntos: 0
Exclamación Sql server select que busca rango de fechas y horas

Hola a todos:

Soy nuevo en este foro, espero puedan ayudarme. Sin mas que decir ire al grano.

Quisiera crear una sentencia sql, la cual me devuelva un rango de fechas y en esta fechas un rango de horas, por si no me explico mostrare lo siguiente:

Tengo una tabla TB_Fechas con un unico campo fechas (solo para que me puedan entender)

Fechas
--------------------------------
2011-08-08 08:30:00.000
2011-08-08 09:30:00.000
2011-08-08 10:15:00.000
2011-08-08 12:30:00.000
2011-08-09 08:45:00.000
2011-08-09 09:25:00.000
2011-08-09 20:45:00.000
2011-08-10 08:32:00.000
2011-08-10 08:49:00.000
2011-08-10 16:45:00.000

Lo que quiero es que el select concidere el rango de fechas y rango de horas (sólo debe mostrar las fechas que se encuentren en estos dos rangos), suponiendo que el rango de fechas que quiero es de 2011-08-08 hasta 2011-08-09, y el rango de horas para estas fechas debe ser de 08:30:00 hasta 09:25:00. Esto deberia devolver sólo :

Fechas
--------------------------------
2011-08-08 08:30:00.000
2011-08-09 08:45:00.000
2011-08-09 09:25:00.000

Exactamente este es el resultado que quiero obtener, solo que se enviara como datos los rangos.

Espero averme dejado entender.

Muchas Gracias por su tiempo ...
  #2 (permalink)  
Antiguo 19/08/2011, 07:34
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: Sql server select que busca rango de fechas y horas

Puedes hacerlo con un between fecha1 and fecha2 y que en tu tabla las fechas esten en formato completo.

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 19/08/2011, 15:03
 
Fecha de Ingreso: diciembre-2010
Mensajes: 7
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Sql server select que busca rango de fechas y horas

Gracias Libras pero lo que mencionas ya lo sabia y no responde mi pregunta gracias de todos modos ....

Por favor fijense en el resultado que quiero mostrar ....
  #4 (permalink)  
Antiguo 19/08/2011, 15:33
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: Sql server select que busca rango de fechas y horas

Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. fecha datetime
  3. )
  4. INSERT INTO #temp VALUES ('2011-08-08 08:30:00.000')
  5. INSERT INTO #temp VALUES ('2011-08-08 09:30:00.000')
  6. INSERT INTO #temp VALUES ('2011-08-08 10:15:00.000')
  7. INSERT INTO #temp VALUES ('2011-08-08 12:30:00.000')
  8. INSERT INTO #temp VALUES ('2011-08-09 08:45:00.000')
  9. INSERT INTO #temp VALUES ('2011-08-09 09:25:00.000')
  10. INSERT INTO #temp VALUES ('2011-08-09 20:45:00.000')
  11. INSERT INTO #temp VALUES ('2011-08-10 08:32:00.000')
  12. INSERT INTO #temp VALUES ('2011-08-10 08:49:00.000')
  13. INSERT INTO #temp VALUES ('2011-08-10 16:45:00.000')
  14.  
  15. SELECT CONVERT(datetime,fecha) AS fecha FROM #temp WHERE fecha
  16. BETWEEN CONVERT(datetime,('2011-08-08' + ' ' + '08:30:00')) AND CONVERT(datetime,('2011-08-09' + ' ' + '09:25:00'))

No te sirve asi, de los datos que pones regresaria 6 renglones no??

2011-08-08 08:30:00.000
2011-08-08 09:30:00.000
2011-08-08 10:15:00.000
2011-08-08 12:30:00.000
2011-08-09 08:45:00.000
2011-08-09 09:25:00.000


Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 19/08/2011, 15:33
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Sql server select que busca rango de fechas y horas

Hola fox_die283:

La respuesta que de dio Libras es correcta, no entiendo por qué dices que no responde a tu pregunta, y si ya lo sabías no entiendo por qué no lo aplicas...

Código SQL:
Ver original
  1. DECLARE @Fechas TABLE (fecha datetime)
  2. INSERT INTO @Fechas VALUES ('2011-08-08 08:30:00.000')
  3. INSERT INTO @Fechas VALUES ('2011-08-08 09:30:00.000')
  4. INSERT INTO @Fechas VALUES ('2011-08-08 10:15:00.000')
  5. INSERT INTO @Fechas VALUES ('2011-08-08 12:30:00.000')
  6. INSERT INTO @Fechas VALUES ('2011-08-09 08:45:00.000')
  7. INSERT INTO @Fechas VALUES ('2011-08-09 09:25:00.000')
  8. INSERT INTO @Fechas VALUES ('2011-08-09 20:45:00.000')
  9. INSERT INTO @Fechas VALUES ('2011-08-10 08:32:00.000')
  10. INSERT INTO @Fechas VALUES ('2011-08-10 08:49:00.000')
  11. INSERT INTO @Fechas VALUES ('2011-08-10 16:45:00.000')
  12.  
  13. SELECT * FROM @Fechas
  14.  
  15. SELECT * FROM @Fechas
  16. WHERE fecha BETWEEN  '2011-08-08 08:30:00' AND '2011-08-08 09:25:00' OR
  17. fecha BETWEEN '2011-08-09 08:30:00' AND '2011-08-09 09:25:00'
  18.  
  19. /*
  20. fecha
  21. -----------------------
  22. 2011-08-08 08:30:00.000
  23. 2011-08-09 08:45:00.000
  24. 2011-08-09 09:25:00.000
  25. */

Para la próxima ten más cuido al comentar algo acerca de la ayuda que alguien te ofrezca... recuerda que la única intención que tenemos es tratar de ayudar. Y antes que de el compañero Iislas lo haga, te recuerdo que NO ES RECOMENDABLE UTILIZAR LA FUNCIÓN BETWEEN CON FECHAS, es mejor hacer las comparaciones con <= y >=.

Saludos
Leo.
  #6 (permalink)  
Antiguo 19/08/2011, 15:34
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Sql server select que busca rango de fechas y horas

Jejeje... otra vez pisándole los talones a Libras... un saludo y buen fin de semana

Leo
  #7 (permalink)  
Antiguo 19/08/2011, 15:36
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: Sql server select que busca rango de fechas y horas

Jajaja asi pasa cuando sucede mi buen Leo :), saludos y buen fin :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 20/08/2011, 16:18
 
Fecha de Ingreso: diciembre-2010
Mensajes: 7
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Sql server select que busca rango de fechas y horas

Disculpen si cause algún malestar con mi respuesta.

Creo que no me explique bien. Lo que tengo ahora es lo siguiente (gracias a libras y leonardo_josue):

CREATE PROCEDURE usp_BuscarFechaHora
@DeFecha CHAR(11),
@HastaFecha CHAR(11),
@DeHora CHAR(8),
@HastaHora CHAR(8)
AS

SELECT * FROM Fechas
WHERE Fecha BETWEEN @DeFecha+' '+@DeHora AND @HastaFecha+' '+@HastaHora
OR Fecha BETWEEN @DeFecha+' '+@DeHora AND @HastaFecha+' '+@HastaHora

GO


Pero esto no devuelve lo que realmente quiero, ya que funciona solo para dos fechas. Lo que quiero es que me devuelva según UN RANGO DE FECHAS Y PARA CADA FECHA SE RESPETE EL RANGO DE HORAS.

Es decir si lo que contiene la tabla fuera :

Fecha
--------------------------------
2011-08-08 08:30:00.000
2011-08-08 09:30:00.000
2011-08-08 10:15:00.000
2011-08-08 12:30:00.000
2011-08-09 08:45:00.000
2011-08-09 09:25:00.000
2011-08-09 20:45:00.000
2011-08-10 08:32:00.000
2011-08-10 08:49:00.000
2011-08-10 16:45:00.000


Y le envio como datos al store procedure :
usp_BuscarFechaHora '2011-08-08','2011-08-10','08:30:00','09:00:00'

Lo que me debería devolver seria :

Fecha
--------------------------------
2011-08-08 08:30:00.000
2011-08-09 08:45:00.000
2011-08-10 08:32:00.000
2011-08-10 08:49:00.000

Como vemos en estos resultados se muestra también el día 9, y esta bien ya que el día 9 pertenece al rango que ingrese (de día 8 hasta día 10), y para cada de estos días el rango de horas de 08:30:00 hasta 09:00:00.

Espero a ver sido lo suficientemente claro y me disculpo nuevamente por a ver causado algún malestar con mi respuesta.

De nuevo gracias por su tiempo.
  #9 (permalink)  
Antiguo 22/08/2011, 07:36
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: Sql server select que busca rango de fechas y horas

a ver explicate mejor, a lo que veo asi como lo tienes funciona between fecha1 hora 1 hasta fecha 2 hora 2 no???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 22/08/2011, 09:03
 
Fecha de Ingreso: diciembre-2010
Mensajes: 7
Antigüedad: 13 años, 3 meses
Puntos: 0
Exclamación Respuesta: Sql server select que busca rango de fechas y horas

No, si te fijas en mi comentario anterior se debería poder ingresar un rango de fechas y para cada dia de estas fechas preguntar por el rango de horas.

En mi comentario anterior esta mejor explicado.

Gracias Libras.
  #11 (permalink)  
Antiguo 22/08/2011, 09:30
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: Sql server select que busca rango de fechas y horas

Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. fecha datetime
  3. )
  4. INSERT INTO #temp VALUES ('2011-08-08 08:30:00.000')
  5. INSERT INTO #temp VALUES ('2011-08-08 09:30:00.000')
  6. INSERT INTO #temp VALUES ('2011-08-08 10:15:00.000')
  7. INSERT INTO #temp VALUES ('2011-08-08 12:30:00.000')
  8. INSERT INTO #temp VALUES ('2011-08-09 08:45:00.000')
  9. INSERT INTO #temp VALUES ('2011-08-09 09:25:00.000')
  10. INSERT INTO #temp VALUES ('2011-08-09 20:45:00.000')
  11. INSERT INTO #temp VALUES ('2011-08-10 08:32:00.000')
  12. INSERT INTO #temp VALUES ('2011-08-10 08:49:00.000')
  13. INSERT INTO #temp VALUES ('2011-08-10 16:45:00.000')
  14.  
  15. CREATE TABLE #temp2
  16. (
  17. fecha datetime
  18. )
  19.  
  20. DECLARE @dias AS INT
  21. DECLARE @fecha1 datetime
  22. DECLARE @fecha2 datetime
  23. DECLARE @fecha3 datetime
  24. DECLARE @x INT
  25. DECLARE @hora1 VARCHAR(20)
  26. DECLARE @hora2 VARCHAR(20)
  27. --'2011-08-08','2011-08-10','08:30:00','09:00:00'
  28. SET @fecha1='2011-08-08'
  29. SET @fecha2='2011-08-10'
  30. SET @hora1='08:30:00'
  31. SET @hora2='09:00:00'
  32.  
  33. SELECT @dias=datediff(dd,@fecha1,@fecha2)
  34. print @dias
  35. SET @x=0
  36. while @x<=@dias
  37. BEGIN
  38.    SET @fecha3=dateadd(dd,@x,@fecha1)    
  39.    print 'x ' + CONVERT(VARCHAR(2),@x)
  40.    print @fecha3
  41.    INSERT INTO #temp2
  42.    SELECT CONVERT(datetime,fecha) AS fecha FROM #temp WHERE fecha
  43.    BETWEEN CONVERT(datetime,(@fecha3 + ' ' + @hora1)) AND CONVERT(datetime,(@fecha3 + ' ' + @hora2))
  44.    SET @x=@x+1
  45. END
  46. SELECT * FROM #temp2

Saludos!!!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 22/08/2011, 10:25
 
Fecha de Ingreso: diciembre-2010
Mensajes: 7
Antigüedad: 13 años, 3 meses
Puntos: 0
De acuerdo Respuesta: Sql server select que busca rango de fechas y horas

Muchas gracias Libras, lo probé y funciona no pensé que tenia que colocar tanto código , pero es necesario es exactamente lo que quería.

Para los que revisen luego este post al momento de copiar el código reemplacen todos los espacios del código sino les dará el error de "Sintax Error cerca de ' ' ". Al parecer por ahí se oculta un código ASCII.

Muuuuuuuuuuuuchas gracias Libras.
  #13 (permalink)  
Antiguo 22/08/2011, 12:27
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Sql server select que busca rango de fechas y horas

Hola Compañeros...

No entendí muy bien qué es lo que está haciendo Libras, pero funciona jejeje... yo pensé en otra solución un poco más sencilla

Código SQL:
Ver original
  1. DECLARE @DeFecha CHAR(11)
  2. SET @DeFecha = '2011-08-08'
  3. DECLARE @HastaFecha CHAR(11)
  4. SET @HastaFecha = '2011-08-10'
  5. DECLARE @DeHora CHAR(8)
  6. SET @DeHora = '08:30:00'
  7. DECLARE @HastaHora CHAR(8)
  8. SET @HastaHora = '09:00:00'
  9.  
  10. DECLARE @Fechas TABLE (fecha datetime)
  11. INSERT INTO @Fechas VALUES ('2011-08-08 08:30:00.000')
  12. INSERT INTO @Fechas VALUES ('2011-08-08 09:30:00.000')
  13. INSERT INTO @Fechas VALUES ('2011-08-08 10:15:00.000')
  14. INSERT INTO @Fechas VALUES ('2011-08-08 12:30:00.000')
  15. INSERT INTO @Fechas VALUES ('2011-08-09 08:45:00.000')
  16. INSERT INTO @Fechas VALUES ('2011-08-09 09:25:00.000')
  17. INSERT INTO @Fechas VALUES ('2011-08-09 20:45:00.000')
  18. INSERT INTO @Fechas VALUES ('2011-08-10 08:32:00.000')
  19. INSERT INTO @Fechas VALUES ('2011-08-10 08:49:00.000')
  20. INSERT INTO @Fechas VALUES ('2011-08-10 16:45:00.000')
  21.  
  22. SELECT
  23. CONVERT(VARCHAR, fecha, 103),
  24. CONVERT(VARCHAR, fecha, 108)
  25. FROM @Fechas
  26. WHERE
  27. CONVERT(datetime, CONVERT(VARCHAR, fecha, 103), 103)
  28. BETWEEN CONVERT(datetime, @DeFecha, 103) AND CONVERT(datetime, @HastaFecha, 103) AND
  29. CONVERT(datetime, CONVERT(VARCHAR, fecha, 108), 108)
  30. BETWEEN CONVERT(datetime, @DeHora, 108) AND CONVERT(datetime, @HastaHora, 108)
  31.  
  32. /*
  33. fecha
  34. -----------------------
  35. 2011-08-08 08:30:00.000
  36. 2011-08-09 08:45:00.000
  37. 2011-08-10 08:32:00.000
  38. 2011-08-10 08:49:00.000
  39. */

Dale un vistazo para ver si te sirve... y si no, pues está la solución de Libras.

Ojo con los espacios... Efectivamente causan problemas al copiar y pegar directamente en el Managment Studio

Saludos
Leo.
  #14 (permalink)  
Antiguo 22/08/2011, 14:01
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Sql server select que busca rango de fechas y horas

Les recuerdo que el hecho de utilizar CONVERT / CAST en sus filtros (Where), baja notablemente el rendimiento de su consultas.

¿Quieren ayudar al motor?, no utilicen BETWEEN en campos fecha, substituyanlos por >= y <=
__________________
MCTS Isaias Islas
  #15 (permalink)  
Antiguo 22/08/2011, 14:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Sql server select que busca rango de fechas y horas

Cita:
Iniciado por iislas Ver Mensaje
Les recuerdo que el hecho de utilizar CONVERT / CAST en sus filtros (Where), baja notablemente el rendimiento de su consultas.

¿Quieren ayudar al motor?, no utilicen BETWEEN en campos fecha, substituyanlos por >= y <=
Esto lo escribí desde el primer mensaje

Cita:
Para la próxima ten más cuido al comentar algo acerca de la ayuda que alguien te ofrezca... recuerda que la única intención que tenemos es tratar de ayudar. Y antes que de el compañero Iislas lo haga, te recuerdo que NO ES RECOMENDABLE UTILIZAR LA FUNCIÓN BETWEEN CON FECHAS, es mejor hacer las comparaciones con <= y >=.
Saludos
Leo
  #16 (permalink)  
Antiguo 22/08/2011, 16:07
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Sql server select que busca rango de fechas y horas

Era para "RE-Afirmar" lo ya dicho, jajajaja

Saludos
__________________
MCTS Isaias Islas

Etiquetas: fecha, fechas, horas, rango, select, server, sql, tabla, campos
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 19:20.