MySql自定义函数-关于保留小数位的特殊需求
背景
昨天,关于价格详情接口又来了一个小需求,而且有点特别。价格显示:改为保留两位小数,没错,就是保留两位小数。大家是不是想说这没啥特别的。。。数据库都有函数搞定了。例如四舍五入的ROUND(x,d),直接截取的TRUNCATE(x,d),还可以利用类型转换CONVERT(value,type)等等。但是,上面的都不能满足这个保留两位的特殊需求,我们来看一下究竟怎么保留两位:小数点两位后,只要大于0的,就直接进一。例如:1.8100 -> 1.81,1.8102 -> 1.82
分析
那么,这需要怎么解决呢,数据库好像确实没函数来这么弄了,那么只能在sql里判断,或者java里判断了。因为这要快速搞定,就直接在sql里入手了。其实也很简单:如果原数比直接截取两位后的数大,表示两位后还有数,然后就直接+0.01。
sql这么改:
if(price > TRUNCATE(price,2),TRUNCATE(price,2)+0.01,TRUNCATE(price,2)) AS elecPrice
优化-编写自定义函数
回头一想,sql好像写得有点僵硬,如果有多个字段需要这样显示,那岂不是每个都要写这么长一串。又如果不是保留两位,而是保留三位,那么岂不是之前的sql又得全部改一遍。。这么一想,我突然就很头疼。程序员嘛,还是得有点追求,不能只为解决问题,一定要自己思考一种比较好的方案:通用的,简洁的。最后,自己编写了一个通用的函数,可以自定义位数,然后返回处理后的数字。关于MySql如何编写自定义函数,大家可以自己百度一下,下面直接上函数:
drop FUNCTION if exists ENTER_ONE;
create function ENTER_ONE(origin decimal(5,4),digit INT) returns decimal(3,2)
begin
DECLARE result FLOAT;
IF origin > TRUNCATE(origin,digit) THEN
set result = TRUNCATE(origin,digit)+1/POWER(10,digit);
ELSE
set result = TRUNCATE(origin,digit);
END IF;
return result;
end;
下面简单解释一下:
首先,调用此函数得传入两个参数,第一个是要处理的浮点数origin,第二个是要保留的位数digit。
然后,定义好结果result后,开始进行逻辑判断。当然了,还是上面的配方,原数和直接截取digit位后的数进行比较,如果大:则直接截取digit为后的数加上1除去10的digit次方。否则,直接截取digit为数。
最后返回结果result即可。
sql就变得想当简单了:
ENTER_ONE(price,2) as elecPrice
总结
作为程序员,一定要有善于思考,善于总结的能力和习惯,每次解决一个问题,我们要判断这能否做成一个通用的组件或者工具类,方便以后有此需求的小伙伴!
MySql自定义函数-关于保留小数位的特殊需求的更多相关文章
- mysql 自定义函数
原文:http://www.cnblogs.com/zhangminghui/p/4113160.html 引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利 ...
- mysql自定义函数并在存储过程中调用,生成一千万条数据
mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...
- MySQL 自定义函数CREATE FUNCTION实例
分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...
- MySQL自定义函数(四十六)
MySQL自定义函数 一.什么是MYSQL自定义函数? mysql当中的自定义函数,我们简称为UDF,它实际上是一种对MySQL扩展的途径,其用法与内置函数相同. 二.自定义函数应该具备哪些条件? 我 ...
- MySQL自定义函数
用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同. 自定义函数两个必要条件: 参数:可以有另个或多个 返回值:只能有一个 创建自定 ...
- MySQL自定义函数用法详解-复合结构自定义变量/流程控制
自定义函数 (user-defined function UDF)就是用一个象ABS() 或 CONCAT()这样的固有(内建)函数一样作用的新函数去扩展MySQL. 所以UDF是对MySQL功能的一 ...
- MySQL自定义函数与存储过程
1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+---- ...
- mysql自定义函数语法
创建函数 DELIMITER $$DROP FUNCTION IF EXISTS `test` $$CREATE FUNCTION `test`(a int ,b int)RETURNS int BE ...
- java mysql自定义函数UDF之调用c函数
正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. goo ...
随机推荐
- codeforce978C-Almost Arithmetic Progression+暴力,枚举前两个数字的情况
传送门:http://codeforces.com/contest/978/problem/D 题意:求变为等差数列,最小要改动的数字个数: 思路:暴力,这道题只用枚举前面两个数字的情况就ok,反思自 ...
- 牛客练习赛22C Bitset
牛客练习赛22C 一共有 n个数,第 i 个数是 xi xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 感觉二进制真是一个神奇的东西. #include <iost ...
- framework7 picker 具体使用
官网地址:https://framework7.io/docs/picker.html#dom-events <meta charset="UTF-8"> <me ...
- Netty源码分析 (四)----- ChannelPipeline
netty在服务端端口绑定和新连接建立的过程中会建立相应的channel,而与channel的动作密切相关的是pipeline这个概念,pipeline像是可以看作是一条流水线,原始的原料(字节流)进 ...
- 精品自用IDEA插件吐血推荐
Alibaba Java Coding Guidelines 该插件集成了Alibaba代码编程规范,可以帮你找出你的代码怪味道 .gitignore 当你使用Git作为版本工具的时候,想要快速的添加 ...
- maven学习笔记(超详细总结)
目录 项目管理利器--maven 第1章 maven概述 1-1 项目管理利器-maven简介 1.1.1 什么是maven 1.1.2 什么是依赖管理 1.1.3 传统项目的依赖管理 1.1.4 m ...
- 搭建自己的技术博客系列(五)hexo博客接入busuanzi插件,展示访问量和网站运行时间
busuanzi计数脚本 busuanzi官方指引 一.安装脚本(必选) 要使用不蒜子必须在页面中引入busuanzi.js,目前最新版如下. 不蒜子可以给任何类型的个人站点使用,如果你是用的hexo ...
- MySQL的安装与配置——详细教程
免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的 标准化语言,其特点为体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,在 Web 应 ...
- netcore 基于 DispatchProxy 实现一个简单Rpc远程调用
前言 netcore 发布以来,一直很关注netcore的进程.目前在公司负责的网站也历经波折的全部有.net framework 4.0 全部切换到netcore 2.2 版本中.虽然过程遇到的坑不 ...
- linux安装python串口工具pyserial遇到不能成功导入的问题
常规方法:pip install pyserial导入serial后提示: 解决方法:apt install python3-serial 参考:https://stackoverflow.com/q ...