CAST DECIMAL到INT

时间:2011-12-16 16:21:21

标签: mysql

我正在尝试这样做:

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

我在这里查看了帮助常见问题解答:http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html,它说我可以像CAST(val AS TYPE)那样做,但它不起作用。

尝试将小数转换为int,实际值为223.00,我想要223

10 个答案:

答案 0 :(得分:89)

您可以尝试这样的FLOOR功能:

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

如果您知道可以省略小数位,您也可以尝试FORMAT函数:

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

您可以将两个功能组合在一起

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

答案 1 :(得分:20)

从您链接的文章:

  

类型可以是以下值之一:

     

BINARY [(N)]

     

CHAR [(N)]

     

DATE

     

DATETIME

     

DECIMAL [(M [,d)]

     

签名[INTEGER]

     

TIME

     

UNSIGNED [INTEGER]

尝试使用SIGNED代替INT

答案 2 :(得分:19)

中用于此目的的更优化方式*:

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

使用 DIV 1 huge speed improvement超过 FLOOR ,更不用说基于字符串的功能,例如 FORMAT < / p>

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)

(*)注意:正如Grbts所指出的,当与非无符号/正值一起使用时,请注意DIV 1的行为。

答案 3 :(得分:12)

使用此

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

此处a link

答案 4 :(得分:10)

floor()和DIV 1之间存在重要差异。对于负数,它们的行为有所不同。 DIV 1返回整数部分(如有符号所示),而floor(x)返回“不大于x的最大整数值”(来自手册)。所以:选择楼层(-1.1)会产生-2,而选择-1.1 div 1 会产生-1

答案 5 :(得分:7)

CAST()函数不支持MySQL中的“官方”数据类型“INT”,它不在the list of supported types中。使用MySQL,可以使用“SIGNED”(或“UNSIGNED”)代替:

CAST(columnName AS SIGNED)

但是,这似乎是特定于MySQL的(未标准化),因此它可能无法与其他数据库一起使用。至少this document (Second Informal Review Draft) ISO/IEC 9075:1992, Database未在4.4 Numbers部分列出“已签名”/“未签名”。

但是DECIMAL既标准化又受MySQL支持,因此以下内容适用于MySQL(已测试)和其他数据库:

CAST(columnName AS DECIMAL(0))

根据MySQL docs

  

如果比例为0,则DECIMAL值不包含小数点或   分数部分。

答案 6 :(得分:3)

如果您的号码不一定总是以.00结尾,那么还有ROUND()。 ROUND(20.6)将给出21,而ROUND(20.4)将给出20。

答案 7 :(得分:3)

你可以试试这个:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 

答案 8 :(得分:1)

尝试cast (columnName as unsigned)

无符号仅为正值

如果您想包含负值,则cast (columnName as signed)
符号(负包括)和无符号(符号大小的两倍,但非负)之间的差异

答案 9 :(得分:0)

1分: 没有空间b / w CAST和(表达式)。 即,CAST(columnName AS SIGNED)。