Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > SQL Server

Respuesta
 
Herramientas Desplegado
Antiguo 09-ene-2008, 04:25   #1 (permalink)
carlos_c ha deshabilitado el karma
 
Fecha de Ingreso: enero-2008
Mensajes: 4
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.
carlos_c está desconectado   Responder Citando
Antiguo 09-ene-2008, 05:27   #2 (permalink)
Sir Matrix está en el buen camino
 
Avatar de Sir Matrix
 
Fecha de Ingreso: noviembre-2002
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.248
Enviar un mensaje por ICQ a Sir Matrix
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
Sir Matrix está desconectado   Responder Citando
Antiguo 09-ene-2008, 06:35   #3 (permalink)
carlos_c ha deshabilitado el karma
 
Fecha de Ingreso: enero-2008
Mensajes: 4
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.
carlos_c está desconectado   Responder Citando
Antiguo 09-ene-2008, 06:40   #4 (permalink)
carlos_c ha deshabilitado el karma
 
Fecha de Ingreso: enero-2008
Mensajes: 4
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.
carlos_c está desconectado   Responder Citando
Antiguo 09-ene-2008, 06:56   #5 (permalink)
Sir Matrix está en el buen camino
 
Avatar de Sir Matrix
 
Fecha de Ingreso: noviembre-2002
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.248
Enviar un mensaje por ICQ a Sir Matrix
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
Sir Matrix está desconectado   Responder Citando
Antiguo 09-ene-2008, 10:59   #6 (permalink)
Beakdan está en el buen camino
 
Avatar de Beakdan
 
Fecha de Ingreso: noviembre-2002
Ubicación: México, D.F.
Mensajes: 367
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.
Beakdan está desconectado   Responder Citando
Antiguo 09-ene-2008, 15:11   #7 (permalink)
Moderador
Mithrandir llegará a ser famoso muy prontoMithrandir llegará a ser famoso muy pronto
 
Avatar de Mithrandir
 
Fecha de Ingreso: abril-2003
Mensajes: 12.108
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
Mithrandir está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 21:18.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93