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

Caso Anómalo

Estas en el tema de Caso Anómalo en el foro de SQL Server en Foros del Web. Hola a todos. Tenemos un problemón que no tiene ni pies ni cabeza. Llevamos muchos años programando y en uno de nuestros programas hechos en ...
  #1 (permalink)  
Antiguo 09/01/2008, 05:25
 
Fecha de Ingreso: enero-2008
Mensajes: 4
Antigüedad: 16 años, 4 meses
Puntos: 0
Caso Anómalo

Hola a todos. Tenemos un problemón que no tiene ni pies ni cabeza.

Llevamos muchos años programando y en uno de nuestros programas hechos en Visual Basic tenemos un problema excepcionalmente curioso. Resulta que cuando buscamos en una tabla un valor concreto NO SE ENCUENTRA.

Imaginaos la tabla: [operaciones]
Con los campos:
[Id] - Autonumérico
[importe] - Doble

Pues cuando buscamos cualquier importe usando la consulta:
SELECT id FROM operaciones WHERE importe = 7.5
se encuentran los registros sin problemas.

¡¡¡¡¡¡¡¡¡¡¡¡¡ EXCEPTO para el número 7.56 !!!!!!!!!!!!!!!

Si buscamos cualquier otro número funciona, pero no con ese.

¿Se le ocurre algo a alguien?

Muchas gracias a todos.
  #2 (permalink)  
Antiguo 09/01/2008, 06:27
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 23 años, 7 meses
Puntos: 3
Re: Caso Anómalo

Hola,

yo veo que está bien que la consulta no devuelva nada, el valor es 7.56, no 7.5.
Tal vez si le agregas un round puedes manejar lo de los decimales.

Saludos

pd: creo que no existe el tipo "double" en sql server
__________________
|||| ))>_<(( ||||
www.webmagic.cl <-- esta pagina está mala, no la busquen
  #3 (permalink)  
Antiguo 09/01/2008, 07:35
 
Fecha de Ingreso: enero-2008
Mensajes: 4
Antigüedad: 16 años, 4 meses
Puntos: 0
Exclamación Re: Caso Anómalo

Bueno en realidad la función Round sólo funciona para el caso de nuestra base de datos en SQL, y tampoco resulta. Ni con un Round aparece. En Access 97 no se puede usar esa función, se usa a partir de 2000.

Lo del tipo Doble hacía referencia a ACCESS, que lo tenemos de tipo Numérico - Doble. En SQL lo tenemos como Float.

Ya sabemos que el problema está en las bases de datos más antiguas. En SQL Server 2005 y en ACCESS 2000 si se puede, pero si probáis a crearos una tabla en Access 97 (tan sencilla como la que os dije antes) y le añadís un registro con el valor de importe 7.56, no la encontraréis con las sentencias SQL. Lo mismo pasa con versiones antiguas de SQLServer, que lo hemos probado (incluso con el Round). Es extremadamente raro pues números como 8.56, 7,55 ó 7.58 se encuentran sin el mayor problema usando la cadena que os comenté antes.

Gracias.
  #4 (permalink)  
Antiguo 09/01/2008, 07:40
 
Fecha de Ingreso: enero-2008
Mensajes: 4
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Caso Anómalo

Cita:
Iniciado por Sir Matrix Ver Mensaje
yo veo que está bien que la consulta no devuelva nada, el valor es 7.56, no 7.5.
No me expliqué bien. El registro de la base de datos tiene en su importe 7.56. Y es lo que no funciona haciendo la consulta y buscando 7.56 lógicamente. Si el registro tiene 7.5 y lo buscas por 7.5, sí aparece.

Como bien dices, si el resgitro tuviera 7.56 y lo buscas con 7.5 es normal que no aparezca. Pero no es el caso. Buscamos lo que tenemos y no aparece si es ese puñetero número. Es una locura.
  #5 (permalink)  
Antiguo 09/01/2008, 07:56
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 23 años, 7 meses
Puntos: 3
Re: Caso Anómalo

Hola, que raro lo de las versiones antiguas. En mssql podría solucionarse cambiando el tipo de datos de float a un decimal o numeric que acepte los decimales que necesites. El tipo folat no es muy preciso:
"float y real: Tipos de datos numéricos y aproximados que se utilizan con datos numéricos de punto flotante. Los datos de punto flotante son aproximados; no todos los valores del intervalo del tipo de datos se pueden representar con precisión."

En access 97 ni idea, sòlo podrías probar consultando por algo como
SELECT id FROM operaciones WHERE importe > 7.55 and importe <7.57

y ver si así te trae los datos, alomejor el valor en realidad no es de 7.56 sino algo como 7.56000000000000000001 :P

saludoss
__________________
|||| ))>_<(( ||||
www.webmagic.cl <-- esta pagina está mala, no la busquen
  #6 (permalink)  
Antiguo 09/01/2008, 11:59
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 5 meses
Puntos: 7
Re: Caso Anómalo

Cita:
a lo mejor el valor en realidad no es de 7.56 sino algo como 7.56000000000000000001
Sir Matrix tiene razón. Además, no es un caso anómalo. Es un error de diseño el definir un campo que guarda un valor monetario como float. La documentación de SQL Server es muy explicita sobre los tipos de datos.

Cita:
float and real:
Approximate-number data types for use with floating point numeric data. Floating point data is approximate; therefore, not all values in the data type range can be represented exactly.
Para valores monetarios deberías usar money o smallmoney los cuales tienen una precisión hasta la diezmilésima. Si no bastara con esa precisión, entonces tienes numeric o decimal. Money, SmallMoney, Numeric y Decimal están clasificados en la documentación de SQL Server como valores númericos exactos.
  #7 (permalink)  
Antiguo 09/01/2008, 16:11
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 1 mes
Puntos: 25
Re: Caso Anómalo

select convert(real, 7.56)

Verás que equivale a 7.5599999

Prueba con Money o Numeric como te sugieren.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
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:25.