CAST DECIMAL到INT

Dra*_*cir 67 mysql

我正在尝试这样做:

SELECT CAST(columnName AS INT), moreColumns, etc
FROM myTable
WHERE ...
Run Code Online (Sandbox Code Playgroud)

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

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

Rol*_*DBA 103

你可以尝试像这样的FLOOR函数:

SELECT FLOOR(columnName), moreColumns, etc 
FROM myTable 
WHERE ... 
Run Code Online (Sandbox Code Playgroud)

您也可以尝试FORMAT功能,前提是您知道可以省略小数位:

SELECT FORMAT(columnName,0), moreColumns, etc 
FROM myTable 
WHERE ... 
Run Code Online (Sandbox Code Playgroud)

你可以结合这两个功能

SELECT FORMAT(FLOOR(columnName),0), moreColumns, etc 
FROM myTable 
WHERE ... 
Run Code Online (Sandbox Code Playgroud)

  • 您意识到您不应该在SQL代码中处理格式化吗? (2认同)
  • @TomMedley我会更加细致入微:在创建视图时,SQL查询中的格式化非常方便. (2认同)
  • 这会将逗号作为千位分隔符添加到数字中。 (2认同)

fre*_*ley 20

从您链接到的文章:

类型可以是以下值之一:

BINARY [(N)]

CHAR [(N)]

日期

约会时间

DECIMAL [(M [,d])]

签名[INTEGER]

时间

UNSIGNED [INTEGER]

尝试SIGNED而不是INT


Dav*_*sev 19

为此目的在更优化的方式*:

SELECT columnName DIV 1 AS columnName, moreColumns, etc
FROM myTable
WHERE ...
Run Code Online (Sandbox Code Playgroud)

与FLOOR相比,使用DIV 1是一个巨大的速度提升,更不用说像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)
Run Code Online (Sandbox Code Playgroud)

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


pan*_*nda 12

用这个

mysql> SELECT TRUNCATE(223.69, 0);
        > 223
Run Code Online (Sandbox Code Playgroud)

这是一个链接


小智 10

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


bas*_*ic6 8

CAST()函数不支持MySQL中的"官方"数据类型"INT",它不在支持的类型列表中.使用MySQL,可以使用"SIGNED"(或"UNSIGNED")代替:

CAST(columnName AS SIGNED)
Run Code Online (Sandbox Code Playgroud)

但是,这似乎是特定于MySQL(非标准化),因此它可能无法与其他数据库一起使用.至少本文件(第二次非正式审查草案)ISO/IEC 9075:1992,数据库未在章节中列出"签名"/"未签名" 4.4 Numbers.

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

CAST(columnName AS DECIMAL(0))
Run Code Online (Sandbox Code Playgroud)

根据MySQL文档:

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


小智 5

你可以试试这个:

SELECT columnName1, CAST(columnName2 AS  SIGNED ) FROM tableName 
Run Code Online (Sandbox Code Playgroud)