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

Atuda mejorar select

Estas en el tema de Atuda mejorar select en el foro de SQL Server en Foros del Web. Como están? Tengo una consulta que lo que permite es generar un reporte de unos registros registrados en un determinado rango de fechas. Para eso ...
  #1 (permalink)  
Antiguo 04/02/2008, 11:33
 
Fecha de Ingreso: mayo-2006
Ubicación: Bogotá
Mensajes: 2.061
Antigüedad: 18 años
Puntos: 50
Atuda mejorar select

Como están?

Tengo una consulta que lo que permite es generar un reporte de unos registros registrados en un determinado rango de fechas.
Para eso le pido al usuario una fecha inicial y una fecha final y hago la consulta a la Base de datos.

Tengo este select

select * from Eventos where Fecevento Between '2008-01-01' and '2008-01-04' order by Fecevento desc, Codevento desc


Pero si por ejemplo el registro se inserto exactamente el 2008-01-04 no me lo muestra solo me muestra los que se insertaron el 2008-01-02 y 2008-01-03

¿Como puedo mejorar la consulta para que me muestre tambien los de las fechas dadas.?


Gracias
  #2 (permalink)  
Antiguo 04/02/2008, 13:41
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Atuda mejorar select

La condición Between en esta consulta es equivalente a que escribas Fecevento >= '2008-01-01' and Fecevento <= '2008-01-04'. Pero, seguramente tu campo Fecevento incluye la hora. Los únicos valores de la fecha 2008-01-04 que se incluirán en tu resultado son aquellos que tengan exactamente la hora en 00:00:00.00. Con unos milisegundos que incluya ya no serán considerados.
Tu condición para incluir los registros de esa fecha debería ser entonces:
Código:
Fecevento >= '2008-01-01' and Fecevento < '2008-01-05'
La pregunta que deberías hacerte si te encuentras frecuentemente con este problema es si acaso la hora debe ser almacenada. Algunas veces es un error (en caso de que nunca sea usada), y podrías evitarlo poniendo un constraint en ese campo.

Última edición por Beakdan; 04/02/2008 a las 14:03
  #3 (permalink)  
Antiguo 04/02/2008, 13:58
 
Fecha de Ingreso: mayo-2006
Ubicación: Bogotá
Mensajes: 2.061
Antigüedad: 18 años
Puntos: 50
Re: Atuda mejorar select

Gracias por contestar.

Si tiene la hora también y si la van a utilizar no se para que. Si lequito el = de la segunda condicion sigo en el mismo problema no me muestra los registros que se hicieron en la segunda fecha!


Que mas puedo hacer?

En que caso es que se usa el constraint que me comento? Como se usa?


Gracias
  #4 (permalink)  
Antiguo 04/02/2008, 14:05
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Atuda mejorar select

Te sugería lo del constraint para que no guardara la parte de la hora, pero sólo en caso de que no la usaran.
Ahora bien, fíjate que no sólo se trata de quitar el = de la segunda parte. Se trata de usar una fecha un día mayor. En pocas palabras: Todos los registros con fecha 2008-01-04 sin importar la hora son siempre menores que 2008-01-05 ¿no?
  #5 (permalink)  
Antiguo 04/02/2008, 14:13
 
Fecha de Ingreso: mayo-2006
Ubicación: Bogotá
Mensajes: 2.061
Antigüedad: 18 años
Puntos: 50
Re: Atuda mejorar select

Gracias ya encontre la solucion.

Pues teniendo en cuenta que usted me habia explicado cual era el problema me puse a cacharrear y esta fue la consulta que me funciono depronto alguien a tenido el mismo problema yle puede servir


select * from Eventos where Fecevento Between '2008-01-01 00:00:00' and '2008-01-04 23:59:59' order by Fecevento desc, Codevento desc


en php quedo asi:

Código PHP:
$RepEventos mssql_query("select * from Eventos where Fecevento Between '$FecInicial 00:00:00' and '$FecFinal 23:59:59' order by Fecevento desc, Codevento desc"); 
  #6 (permalink)  
Antiguo 04/02/2008, 14:18
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 4 meses
Puntos: 7
Re: Atuda mejorar select

Sólo recuerda que si tu campo es DATETIME, también guarda los milisegundos. Y si por alguna razón tuvieras un registro con fecha como 2008-01-04 23:59:59.33, este no se incluiría en tu consulta.
Sólo verifica que no exista tal posibilidad.
Saludos.
  #7 (permalink)  
Antiguo 07/02/2008, 10:59
Avatar de Thumper  
Fecha de Ingreso: agosto-2004
Ubicación: Jesús María - Lima - Perú
Mensajes: 270
Antigüedad: 19 años, 8 meses
Puntos: 6
Re: Atuda mejorar select

Lo q prodrías hacer para evitar esto tambien es resta 1 dia a la fecha de inicio y sumarle y dia a la fecha de fin, asi usas ese error como una ventaja y te evitas el hecho de los segundos y milisegundos.

SAludos
__________________
Martín Alexis Valdivia S.
-----------------------------
"Quisiéramos cambiar el mundo, pero Dios no nos daría el código fuente." CAP
"Si Saber No Es Un Derecho, Seguro Será Un Izquierdo." WD
  #8 (permalink)  
Antiguo 07/02/2008, 19:06
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 10 meses
Puntos: 180
Re: Atuda mejorar select

Pero siempre lo recomendable en el uso de fechas en SQL SERVER, es evitar el BETWEEN y usar el >= o <=, no lo digo yo, lo he leido mas de una vez en la red:

http://www.crostonectingpeople.com/2...sql-sever.html

http://www.mug.org.ar/SQL/ArticSQL/240.aspx
  #9 (permalink)  
Antiguo 10/02/2008, 09:37
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Atuda mejorar select

a mi siempre me funciona el formato ASCII, para mi es el mas seguro....

Código:
Select *
From Eventos
Where Fecevento Between '20080101 00:00:00.000' and '20080104 23:59:59.999'
Order by Fecevento desc, Codevento desc
Por cierto, esto tambien cubre milisegundos....


Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
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 14:25.