SQL - problema consulta de fechas

   
Vista:

problema consulta de fechas

Publicado por xpomp (10 intervenciones) el 30/05/2008 12:20:48
Hola a todos tengo un problema a la hora de filtrar por fechas.
Pongamos que yo tengo:
Dim f_inicial as date;
Dim f_final as date;
Y quiero filtrar entre dos fechas:

Sería algo así donde "fecha" de la tabla1 es de tipo "varchar"?

"Select * from tabla1 where (CONVERT(DATETIME, fecha, 102)) >= " & f_inicial & "and CONVERT(DATETIME, fecha, 102) <= " & f_final

La sentencia se ejecuta puesto que no me da error lo que pasa esque no selecciona nada. Yo creo que va a ser por el contenido de la cadena puesto que ya contiene las barras del formato. La columna fecha contiene
fecha->'12/12/2002' si fuera fecha->'12122002' o '12-12-2002' seguramente funcionaría.

Alguien sabría decirme algo por donde tirar?
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:problema consulta de fechas

Publicado por pacopaz (143 intervenciones) el 30/05/2008 17:20:16
xpomp, Y si la conversión la realizas a la inversa, es decir, ya que tabla1.fecha es un varchar, es más fácil formatear una cadena en vb que mandar una fecha desde vb y formatear un varchar a fecha en sql.
segun lo que entiendo (o lo que leo en tu query) f_inicial y f_final son de tipo date en vb, y fecha tiene formato dd/mm/yyyy.
Si es así, es entonces más fácil que hagas esto:

"Select * from tabla1 where trim(fecha) >= " & format(f_inicial,"DD/MM/YYYY") & "and trim(fecha) <= " & format(f_final,"DD/MM/YYYY")

Sin embargo, lo que me causa más preocupación es la implementación de fecha como cadena, por que si tu quieres hacer una consulta de fechas entre 01/01/2008 <= [fecha] <= 02/01/2008 (dd/mm/yyyy), para date, solo traería estos dos días, pero para el caracter, traería 01/01/2008, 01/02/2008, 01/03/2008, 01/04/2008, etc.
Si aún se quiere implementar la fecha como char o varchar en la BD, habría de hacerse en formato yyyy/mm/dd (con o sin diagonales, guinoes, espacios, etc).

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema consulta de fechas

Publicado por xpomp (10 intervenciones) el 30/05/2008 17:40:07
Hola Pacopaz, la verdad es que no lo habia pensado así, respecto a la función format la había mirado por encima pero no le encontraba ninguna utildad para esto.
Lo he probado y me dice que la función trim(fecha) no existe. Eso del trim() para que sirve. Eso es así? o es una errata.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema consulta de fechas

Publicado por pacopaz (143 intervenciones) el 30/05/2008 18:18:05
Lo lamento (la costumbre de últimamente estar trabajando con oracle), trim reemplazalo con rtrim.
La explicación: Los campos de tipo texto, se definen con una cantidad exacta de caracteres esperados, aunque no se hayan de ocupar todos en cada uno de los registros. Entonces que hace la base de datos con los espacios faltantes? para tipos varchar, trunca esos espacios, pero para los tipo char los llena de espacios del lado derecho, lo cual puede comparar erroneamente un par de textos.
RTrim hace que los espacios a la derecha se trunquen, para que lo que compares sea texto contra texto y no texto + espacios contra textos.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema consulta de fechas

Publicado por xpomp (10 intervenciones) el 30/05/2008 18:37:26
Tengo que comunicarte que tampoco me pilla rtrim aunque ahora que dices lo de truncar si que existe una funcion en sql que es trunc, no se si servirá porque aun no he mirando ni que ni como se utiliza, por otro lado he quitado lo de trim o rtrim y esta vez lo que NO me reconoce es función format(). Que me pasa lo mismo que con la función to_date() estas seguro que format() se utiliza tb para sql.

De todas formas gracias por contestar así no me aburro porque me vas diciendo cosas y las voy probando. Porque vamos estoy cerca de tirar la toalla y hacerlo todo por código vb y fuera que es como lo tenia antes pero como bien sabras es mucho menos eficiente o lento.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema consulta de fechas

Publicado por pacopaz (143 intervenciones) el 30/05/2008 18:52:38
Venga, ánimo, master, que tampoco es un roblemón lo que tenemos en frente.
Estoy asumiento que te conectas a una base de datos SQL Server, aunque no se que versión y tu aplicación está desarrollándose en vb6.
el format no es para la tabla, es para tu variable en vb. En principio asumo (de nuevo) que f_inicio y f_final son variables en vb y que las concatenas para tener un query que mandar hacia la base de datos. Y me acabo de dar cuenta de cual es el error que estoy cometiendo :P
f_inicio y f_final son de tipo string, cierto?
Ok, entonces habría que formarlas con el formato que tienen los datos en la base de datos (según entiendo es dd/mm/yyyy) y pasarlos entre comilllas simples.
No entiendo por que no reconoce el rtrim, pero si funciona pese a ello, omite el rtrim.
trunc es una función para valores float o de tipo datetime, en los primeros, devuelve la parte entera y para los segundos, devuelve la fecha sin la hora.
Ahora, también lo que puedes hacer con el código original que tenías antes de que ampliara tus dudas, es cambiar el valor 102 por 103, en el CONVERT.
Si de todo esto te ha servido algo, me avisas. :)

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema consulta de fechas

Publicado por xpomp (10 intervenciones) el 30/05/2008 19:17:47
Vale, por partes fecha inicio y fecha final son de tipo date, la que es de tipo varchar es el campo fecha de tabla1, el problema real esque el campo fecha no sea de tipo date porque esta consulta sería algo trivial donde where fecha>=f_inicial and fecha<=f_final.
He probado a extraer el campo fecha meterlo en una variable string y mas tarde pasarlo a date y compar las fechas en un principio funciona pero es super lento. Porque saco todas las filas para posteriormente hacer el filtro con un if en vb, cuando lo suyo seria que en mismo select filtrará.

Por otro lado programo con vb .net del vs2005.
Saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema consulta de fechas

Publicado por pacopaz (143 intervenciones) el 30/05/2008 19:42:08
Y tienes toda la razón, eso es lentísimo.
ahora, el problema es que, aunque pudieras cambiar las fechas de la base de datos (tipo char) a datetime, no puedes formar tu query insertando un date así no más. Bueno, si puedes, pero nunca va a coindicir.
Por eso propuse la función de vb Format. Esta haría que tu fecha se convirtiera satisfactoriamente a texto, para poder enviarla a la bd.
Según entiendo ejecutarías un DataReader para traer las filas resultantes de tu query. Normalmente lo que hago en vs2005 (o hacía hasta hace medio año), es trabajar con OleDb, creando un conection, un command y un datareader, usando el Namespace System.Data.OleDb. Algo como esto:

Using connection As New OleDbConnection(connectionString)
Dim command As New OleDbCommand(queryString, connection)
connection.Open()
Dim reader As OleDbDataReader = command.ExecuteReader()
While reader.Read()
'Manipulamos los registros
End While
reader.Close()
End Using

Lo que nos interesa aquí es el queryString, que según yo, ya con los datos que tengo, debería ser de la forma:

queryString = "select * from tabla1 where fecha >= '" & _
format(f_inicial, "dd/MM/yyyy") & _
"' and fecha <= '" & _
format(f_final , "dd/MM/yyyy") & "'"

Espero que esto si funcione.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema consulta de fechas

Publicado por xpomp (10 intervenciones) el 30/05/2008 19:59:38
Bueno se a terminado la jornada por fin ya lo probare el lunes, gracias de antemano,
Pero si , si que hago lo que has indicado anteriormete pero con una diferencia y es que utilzo una conexion sqlclient pero basicamente hace lo mismo.
Buen finde para todos.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:problema consulta de fechas

Publicado por xpomp (10 intervenciones) el 02/06/2008 11:08:14
Hola pacopaz, he estado probando la sentencia que me pusistes donde lo que me muestra entre 12/12/2002 hasta 14/12/2002 todas las filas que sus fechas son día 13 o 14, lo que se resume a que filtra por día únicamente. Pero bueno es un comienzo
voy ver si consigo que me funcione.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar