it-swarm-pt.tech

MOLDE DECIMAL para INT

Estou tentando fazer isso:

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

Eu olhei para as FAQs de ajuda aqui: http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html , diz que eu posso fazer como CAST(val AS TYPE), mas não está funcionando.

Tentando converter um decimal para int, o valor real é 223.00 e eu quero 223

61
Drahcir

Você poderia tentar a função FLOOR assim:

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

Você também pode tentar a função FORMAT , desde que saiba que as casas decimais podem ser omitidas:

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

Você poderia combinar as duas funções

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

Do artigo que você vinculou a:

O tipo pode ser um dos seguintes valores:

BINÁRIO [(N)]

CHAR [(N)]

ENCONTRO

DATA HORA

DECIMAL [(M [ D])]

ASSINADO [INTEGER]

TEMPO

UNSIGNED [INTEGER]

Tente SIGNED em vez de INT

20
fredley

Uma maneira mais otimizada em mysql para este propósito *:

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

Usando DIV 1 é um melhoria de velocidade enorme over FLOOR, para não mencionar funções baseadas em strings 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 apontado por Grbts, esteja ciente do comportamento de DIV 1 quando usado com valores não assinados/positivos.

19
David Strencsev

usa isto

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

Aqui está m link

12
panda

Há uma diferença importante entre floor () e DIV 1. Para números negativos, eles se comportam de maneira diferente. DIV 1 retorna a parte inteira (como lançada como assinado), enquanto floor (x) retorna "o maior valor inteiro não maior que x" (do manual). Então: selecione floor (-1.1) resulta em -2, enquanto selecione -1.1 div 1 resulta em -1

10
Grbts

A função CAST () não suporta o tipo de dados "oficial" "INT" no MySQL, não está em a lista de tipos suportados . Com o MySQL, "SIGNED" (ou "UNSIGNED") pode ser usado no lugar:

CAST(columnName AS SIGNED)

No entanto, isso parece ser específico do MySQL (não padronizado), portanto, pode não funcionar com outros bancos de dados. Pelo menos este documento (Segundo Rascunho de Revisão Informal) ISO/IEC 9075: 1992, Banco de Dados não lista "ASSINADO"/"NÃO ASSINADO" na seção 4.4 Numbers.

Mas o DECIMAL é padronizado e suportado pelo MySQL, então o seguinte deve funcionar para o MySQL (testado) e outros bancos de dados:

CAST(columnName AS DECIMAL(0))

De acordo com o docs do MySQL :

Se a escala for 0, os valores DECIMAIS não contêm ponto decimal ou parte fracionária.

7
basic6

você pode tentar isso:

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

Há também ROUND () se seus números não necessariamente sempre terminam com .00. ROUND (20.6) dará 21, e ROUND (20.4) dará 20.

3
Jamie Brown

Tente cast (columnName as unsigned)

sem assinatura é apenas valor positivo

Se você quiser incluir um valor negativo, cast (columnName as signed),
A diferença entre o sinal (incluir negativo) e o não assinado (duas vezes o tamanho do sinal, mas não negativo)

1
ajreal

1 cêntimo: sem espaço b/w CAST e (expressão). isto é, CAST (columnName AS SIGNED).

0
bbe