首页 > 数据库 >mysql之sql查询结果集小数保留

mysql之sql查询结果集小数保留

时间:2023-05-29 16:12:14浏览次数:48  
标签:示例 -- mysql RTRIM sql 13.123 ROUND SELECT 小数

客户要求,跟金额相关的数据,打印出来要保留两位小数,比如:13.2/13.200要显示为13.20;

分析:

首先查看数据库中的数据定义,均为decimal(12,2) ,直接通过数据库查询的结果也会保留两位小数,但是代码处理后,却会忽略掉最后一个“零”位。

此处有两个解决方案:

  一、 代码中处理,检测到为金额字段,做特殊处理;二、修改查询SQL语句去规避此问题; 第一种方法,无论通过数据类型还是字段名称,都不好判断是否为金额,故选用第二种方法。

SQL中保留两位小数的方法有三种,(第2、3种方法类似):

1、使用ROUND()函数,ROUND返回一个数值,舍入到指定的长度或精度,使用示例:

复制代码 复制代码
SELECT ROUND(123.9994, 3)   --123.9990
SELECT ROUND(123.9995, 3)   --124.0000
SELECT ROUND(748.584, -1)   --750.000
SELECT ROUND(748.586, -2)   --700.000
SELECT ROUND(748.586, -3)   --Error 将expression转换为数据类型 numeric 时出现算术溢出错误
SELECT ROUND(748.586, -4)   --0.000,如果length为负数,并且大于小数点前的数字个数,则ROUND将返回 0
SELECT ROUND(151.75, 0,0)   --152.00 舍入
SELECT ROUND(151.75, 0,1)   --151.00 截断
复制代码 复制代码

 

2、使用CONVERT()函数,使用示例:

  SELECT CONVERT(DECIMAL(13,2),13.123) --13.12 

3、使用CAST()函数,使用示例:

  SELECT CAST(13.123 as DECIMAL(13,2)) --13.12 

 

这三种方法(其实是两种),还是有区别的,区别在于ROUND()只是进行四舍五入,仍然会保留后面的位数为0,但是convert()和cast() 却会截断后面的位数,示例:

SELECT CONVERT(DECIMAL(13,2),13.123)    --13.12
SELECT CAST(13.123 as DECIMAL(13,2))    --13.12
SELECT ROUND(13.123,2)                  --13.120

 注:必须保证显示的位数,大于保留的小数位数,不然会出错。

        数据最好采用varchar类型存储。

不建议使用convert.

根据需求这里采用第2种方案,但是仅这样处理还是不够的,返回的float型,经过代码处理后,仍然会舍去最后的"0"位。

 

最终的解决方案为:数据库查询时,把float型数据转换为字符型,再交由代码处理返回给客户端。

具体实现为:

 SELECT RTRIM(CONVERT(DECIMAL(13,2),13.123)) 

 

附RTRIM()的用法,返回删除了尾随空格的字符表达式。:

RTRIM(character expression)

示例:

SELECT RTRIM('Hello   ')+'%'                    --Hello%
SELECT RTRIM('Hello')+'%'                       --Hello%
SELECT RTRIM('hello ' + '' + 'world ')+'%'      --helloworld%
SELECT RTRIM('hello ' + '' + 'world ')+'%'      --hello world%
SELECT RTRIM('hello' + ' ' + 'world ')+'%'      --hello world%

标签:示例,--,mysql,RTRIM,sql,13.123,ROUND,SELECT,小数
From: https://www.cnblogs.com/csnjava/p/17440717.html

相关文章

  • 简单MySQL例子演示MVCC
    一沈秋园,满庭霜落,云烟北桥夜连城MVCC是多版本并发控制的缩写,是一种数据库和编程语言中常用的并发控制方法。它通过保存数据的历史版本,实现对数据库的高效访问。MySQL中MVCC主要是通过行记录中的隐藏字段(隐藏主键row_id,事务IDtrx_id,回滚指针roll_pointer),undo_log(版本链),Rea......
  • SQL的联合查询
    SQL的联合查询(UnionQuery)是一种将两个或多个SELECT语句的结果集合并在一起的方法。它可以将多个查询的结果合并成一个大的结果集,这个大的结果集中包含了原始查询的所有数据行。这个特性使得联合查询成为了SQL语言中非常强大和常用的功能之一。1、基本语法SELECTcolumn_name(s)......
  • 转:SqlServer锁机制与实践
    转自:https://www.cnblogs.com/wangweitr/p/7158023.html在如今这个云计算,大数据,移动互联网大行其道的时代,各种NoSQL数据库MongoDb、redis、HBase等使用的越来越广泛,大有替代关系型数据库的趋势。但是关系型数据库真的已经落伍了吗?答案是否定的。非关系型数据库不支持ACID属性,不支......
  • docker部署ZeLog项目(Tomcat+MySQL+ZrLog)
    一.docker的安装1.1、在安装dockers之前,建议关闭Centos7.9防火墙[root@192~]#systemctlstopfirewalld[root@192~]#setenforce0 setenforce是Linux的selinux防火墙配置命令执行setenforce0表示临时关闭selinux防火墙1.2、通过yum在线安装Docker服务[root@localhos......
  • mysql快速对比两个数据库表名的差异
    2023年5月29日14:51:02因为正式库老是和测试库有差1-2张表,表也有100张了,排除差异有点麻烦SELECTtable_nameFROMinformation_schema.TABLESWHEREtable_schema='数据库名'这样就得到两个数据库表名列新建两个txt,database.txt和database_test.txt选中两个文件,右键使用T......
  • SQL中join后的on和where的过滤条件的区别
     1、原理1.1连接基本概念(1)内连接(innerjoin、join):必须完全满足连接运算(natural、using、on)的左右表数据行。(2)左外连接(leftouterjoin、leftjoin):仅保留左表在连接运算之前的数据行,无匹配的右表列填充null。(3)右外连接(rightouterjoin、rightjoin):仅保留右表在连接运算之前......
  • 玩转MySQL数据库之SQL优化之慢查询
    本系列为:MySQL数据库详解,为千锋资深教学老师独家创作,致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~文末有本文重点总结,技术类问题,也欢迎大家和我们沟通交流!前言从今天开始本系列文章就带各位小伙伴学习......
  • MySQL索引(一)
    雨喝醉了,小路摇摇晃晃,倒在我怀里1,B树和B+树之间的区别是什么?2,Innodb中的B+树有什么特点?3,什么是Innodb中的page?4,Innodb中的B+树是怎么产生的?5,什么是聚簇索引?6,Innodb是如何支持范围查找能走索引的?7,什么是联合索引?对应的B+树是如何产生的?8,什么是最左前缀原则?......
  • SqlServer中的锁
    共享锁(SharedLock):表示一个事务正在读取一行数据,其他事务也可以读取同一行数据,但不能进行写操作。也称为"S锁"或"读锁"。--在事务中获取共享锁BEGINTRANSACTION;SELECT*FROMtable_nameWITH(TABLOCKX,HOLDLOCK)WHEREcolumn_name='value';--其他事务可以......
  • mysql、sqlserver、oracle分页,java分页统一接口实现
    定义:pageStart起始页,pageEnd终止页,pageSize页面容量oracle分页:rownum numfrom(实际传的SQL)where rownum<=pageEnd)wherenum>=pageStartsqlServer分页:           select*from(select top 页面容量from(select top字段Adesc)astemptable2orderb......