EMITIR DECIMAL a INT

81

Estoy tratando de hacer esto:

SELECT CAST(columnName AS INT), moreColumns, etc
FROM myTable
WHERE ...

He visto las preguntas frecuentes de ayuda aquí: http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html , dice que puedo hacerlo como CAST(val AS TYPE), pero no funciona.

Tratando de convertir un decimal a int, el valor real es 223.00 y quiero 223

Drahcir
fuente
La advertencia de casting es porque está suministrando una cuerda, ¿puede confirmarlo?
ajreal
Está funcionando incluso con Maria DB también
Niyati

Respuestas:

126

Podría probar la función FLOOR de esta manera:

SELECT FLOOR(columnName), moreColumns, etc 
FROM myTable 
WHERE ... 

También puede probar la función FORMAT , siempre que sepa que se pueden omitir los lugares decimales:

SELECT FORMAT(columnName,0), moreColumns, etc 
FROM myTable 
WHERE ... 

Puedes combinar las dos funciones

SELECT FORMAT(FLOOR(columnName),0), moreColumns, etc 
FROM myTable 
WHERE ... 
RolandoMySQLDBA
fuente
2
¿Se da cuenta de que no debería estar tratando con formatear en su código SQL, verdad?
Fredley
Buen trabajo, +1. El formato funciona bien para mi situación, pero todavía me pregunto si alguien puede hacerlo con CAST
Drahcir
@TomMedley: Sí, no lo haría si estuviera usando PHP también, pero esto es solo para algunos disparadores y funciones
Drahcir
2
@TomMedley Sería más matizado: el formato en la consulta SQL es útil al crear vistas.
VH-NZZ
1
Esto agrega comas como separadores de miles al número.
Jan Špaček
22

Una forma más optimizada de para este propósito*:

SELECT columnName DIV 1 AS columnName, moreColumns, etc
FROM myTable
WHERE ...

El uso de DIV 1 es una gran mejora de velocidad con respecto a FLOOR , sin mencionar las funciones basadas en cadenas como FORMAT

mysql> SELECT BENCHMARK(10000000,1234567 DIV 7) ;
+-----------------------------------+
| BENCHMARK(10000000,1234567 DIV 7) |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
1 row in set (0.83 sec)

mysql> SELECT BENCHMARK(10000000,1234567 / 7) ;
+---------------------------------+
| BENCHMARK(10000000,1234567 / 7) |
+---------------------------------+
|                               0 |
+---------------------------------+
1 row in set (7.26 sec)

mysql> SELECT BENCHMARK(10000000,FLOOR(1234567 / 7)) ;
+----------------------------------------+
| BENCHMARK(10000000,FLOOR(1234567 / 7)) |
+----------------------------------------+
|                                      0 |
+----------------------------------------+
1 row in set (8.80 sec)

(*) NOTA: Como señaló Grbts, tenga en cuenta el comportamiento de DIV 1 cuando se usa con valores no sin signo / positivos.

David Strencsev
fuente
21

Del artículo al que vinculó:

El tipo puede ser uno de los siguientes valores:

BINARIO [(N)]

CHAR [(N)]

FECHA

FECHA Y HORA

DECIMAL [(M [, D])]

FIRMADO [INTEGER]

HORA

SIN FIRMAR [INTEGER]

Prueba en SIGNEDlugar deINT

Fredley
fuente
Gracias, pero ahora recibo otro error: código de error 1292, estado SQL 22001: truncamiento de datos: valor INTEGER incorrecto truncado: '558.00'
Drahcir
13

utilizar esta

mysql> SELECT TRUNCATE(223.69, 0);
        > 223

Aquí hay un enlace

panda
fuente
10

Existe una diferencia importante entre floor () y DIV 1. Para números negativos, se comportan de manera diferente. DIV 1 devuelve la parte entera (como lo hace la conversión con signo), mientras que floor (x) devuelve "el valor entero más grande no mayor que x" (del manual). Entonces: seleccionar piso (-1.1) da como resultado -2, mientras que seleccionar -1.1 div 1 da como resultado -1

Grbts
fuente
10

La función CAST () no admite el tipo de datos "oficial" "INT" en MySQL, no está en la lista de tipos admitidos . Con MySQL, "FIRMADO" (o "NO FIRMADO") podría usarse en su lugar:

CAST(columnName AS SIGNED)

Sin embargo, esto parece ser específico de MySQL (no estandarizado), por lo que es posible que no funcione con otras bases de datos. Al menos este documento (Segundo Borrador de Revisión Informal) ISO / IEC 9075: 1992, Base de Datos no incluye "FIRMADO" / "SIN FIRMAR" en la sección 4.4 Numbers.

Pero DECIMAL está estandarizado y es compatible con MySQL, por lo que lo siguiente debería funcionar para MySQL (probado) y otras bases de datos:

CAST(columnName AS DECIMAL(0))

Según los documentos de MySQL :

Si la escala es 0, los valores DECIMAL no contienen punto decimal ni parte fraccionaria.

básico6
fuente
3

También hay ROUND () si sus números no siempre terminan necesariamente en .00. RONDA (20.6) dará 21 y RONDA (20.4) dará 20.

Jamie Brown
fuente
3

puedes probar esto:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 
mshabab
fuente
1

Tratar cast (columnName as unsigned)

unsigned es solo valor positivo

Si desea incluir un valor negativo, entonces cast (columnName as signed),
la diferencia entre el signo (inclusión negativa) y sin signo (el doble del tamaño del signo, pero no negativo)

ajreal
fuente
1

1 centavo: sin espacio b / w CAST y (expresión). es decir, CAST (columnName AS FIRMADO).

bbe
fuente