MYSQL之随机数生成、保留小数位、获取年龄

目录

    • 一、随机数
      • 1.1、rand函数
      • 1.2、随机整数
      • 1.3、随机小数
      • 1.4、更新随机值
    • 二、保留小数位
      • 2.1、round函数
      • 2.2、convert函数
      • 2.3、cast函数
      • 2.4、format函数
    • 三、获取年龄
      • 3.1、方法一
      • 3.2、方法二
      • 3.3、方法三( 推荐
      • 3.4、方法四
    • 四、时间段差异

一、随机数

1.1、rand函数

   RAND() 函数返回 0(包括)和 1(不包括)之间的随机数。

语法如下:

select rand(),rand(),rand();

结果如下:

mysql> select rand(),rand(),rand();
+-------------------+--------------------+--------------------+
| rand()            | rand()             | rand()             |
+-------------------+--------------------+--------------------+
| 0.778827545027088 | 0.4953759373122602 | 0.1403970822136822 |
+-------------------+--------------------+--------------------+
1 row in set (0.00 sec)

1.2、随机整数

  比如生成 [10,100] 的随机数,计算公式为:round(rand() * (m - n) + n)

语法如下:

SELECT round(rand() * (100 - 10) + 10);

结果如下:

mysql> SELECT 
    ->     round(rand() * (100 - 10) + 10) as '随机整数1',
    ->     round(rand() * (100 - 10) + 10) as '随机整数2',
    ->     round(rand() * (100 - 10) + 10) as '随机整数3';
+---------------+---------------+---------------+
| 随机整数1     | 随机整数2     | 随机整数3     |
+---------------+---------------+---------------+
|            45 |            19 |            88 |
+---------------+---------------+---------------+
1 row in set (0.01 sec)

  有些小伙伴可能会用到 floor 函数,在计算闭包区间时,比如生成 [50,200] 的随机数,计算公式为:floor(rand() * (m - n + 1) + n),不要漏掉那个 +1 了,不然你取不到最大值。

语法如下:

SELECT floor(rand() * (200 - 50 + 1) + 50);

1.3、随机小数

  比如生成 [60,100] 范围内的随机小数,计算公式为:round(rand() * (m - n) + n, 2),后面的数字 2 就是保留几位小数。

语法如下:

SELECT round(rand() * (100 - 60) + 60, 2);

结果如下:

mysql> SELECT 
    ->     round(rand() * (100 - 60) + 60, 2) as '随机数1',
    ->     round(rand() * (100 - 60) + 60, 2) as '随机数2',
    ->     round(rand() * (100 - 60) + 60, 2) as '随机数3';
+------------+------------+------------+
| 随机数1    | 随机数2     | 随机数3    |
+------------+------------+------------+
|      60.10 |      99.76 |      98.52 |
+------------+------------+------------+
1 row in set (0.00 sec)

1.4、更新随机值

  比如随机给优惠券金额生成 [5,10] 范围内的随机小数

UPDATE tb_inf_coupon set freeAmount=round(rand() * (10 - 5) + 5);

二、保留小数位

假设我们有们的表数据如下:

mysql> select total_amount,pay_amount,free_amount from tb_coupon;
+--------------+------------+-------------+
| total_amount | pay_amount | free_amount |
+--------------+------------+-------------+
|     10086.21 |       1000 |       86.21 |
|       520.98 |      50000 |       20.98 |
|        19.88 |       1900 |        0.88 |
+--------------+------------+-------------+
3 rows in set (0.00 sec)

  这里的三个金额

  • total_amount double 型,单位是
  • pay_amount int 型,单位是
  • free_amount decimal 型,单位是

  这里只是为了演示,实际工作中绝对不会这样的,精度不高的情况下都是按分存取,就使用 BigInt 类型,如果精度高的就使用 decimal 类型。

2.1、round函数

查询语句

SELECT 
    round(total_amount, 2) as 'round处理double型',
    round(pay_amount / 100.0, 2) as 'round处理int型',
    round(free_amount, 2) as 'round处理decimal型'
FROM
    tb_coupon;

查询结果

+----------------------+-------------------+-----------------------+
| round处理double型    | round处理int型     | round处理decimal型    |
+----------------------+-------------------+-----------------------+
|             10086.21 |             10.00 |                 86.21 |
|               520.98 |            500.00 |                 20.98 |
|                19.88 |             19.00 |                  0.88 |
+----------------------+-------------------+-----------------------+
3 rows in set (0.00 sec)

2.2、convert函数

查询语句

select 
	convert(total_amount, DECIMAL(10, 2)) as 'convert处理double型',
    convert(pay_amount/100.0, DECIMAL(10, 2)) as 'convert处理int型',
    convert(free_amount, DECIMAL(10, 2)) as 'convert处理decimal型'
from  
	tb_coupon;

查询结果

+------------------------+---------------------+-------------------------+
| convert处理double型    | convert处理int型     | convert处理decimal型    |
+------------------------+---------------------+-------------------------+
|               10086.21 |               10.00 |                   86.21 |
|                 520.98 |              500.00 |                   20.98 |
|                  19.88 |               19.00 |                    0.88 |
+------------------------+---------------------+-------------------------+
3 rows in set (0.00 sec)

2.3、cast函数

查询语句

select 
	cast(total_amount as DECIMAL(10,2)) as 'cast处理double型',
    cast(pay_amount/100.0 as DECIMAL(10,2)) as 'cast处理int型',
    cast(free_amount as DECIMAL(10,2)) as 'cast处理decimal型'
from  
	tb_coupon;

查询结果

+---------------------+------------------+----------------------+
| cast处理double型    | cast处理int型     | cast处理decimal型    |
+---------------------+------------------+----------------------+
|            10086.21 |            10.00 |                86.21 |
|              520.98 |           500.00 |                20.98 |
|               19.88 |            19.00 |                 0.88 |
+---------------------+------------------+----------------------+
3 rows in set (0.00 sec)

2.4、format函数

查询语句

select 
	format(total_amount, 2) as 'format处理double型',
    format(pay_amount/100.0, 2) as 'format处理int型',
    format(free_amount, 2) as 'format处理decimal型'
from  
	tb_coupon;  

查询结果

+-----------------------+--------------------+------------------------+
| format处理double型    | format处理int型    | format处理decimal型    |
+-----------------------+--------------------+------------------------+
| 10,086.21             | 10.00              | 86.21                  |
| 520.98                | 500.00             | 20.98                  |
| 19.88                 | 19.00              | 0.88                   |
+-----------------------+--------------------+------------------------+
3 rows in set (0.00 sec)

  从上面的结果我们可以看到当位数超过3位时就会以 逗号 分隔,并且返回的结果是string类型的,所以我们可以优化下,使用 REPLACE 函数把逗号替换为空。

优化查询语句

select 
	REPLACE(format(total_amount, 2),',','') as '优化format处理double型',
	REPLACE(format(pay_amount/100.0, 2),',','') as '优化format处理int型',
	REPLACE(format(free_amount, 2),',','') as '优化format处理decimal型'
from  
	tb_coupon;    

查询结果

+-----------------------------+--------------------------+------------------------------+
| 优化format处理double型       | 优化format处理int型      | 优化format处理decimal型      |
+-----------------------------+--------------------------+------------------------------+
| 10086.21                    | 10.00                    | 86.21                        |
| 520.98                      | 500.00                   | 20.98                        |
| 19.88                       | 19.00                    | 0.88                         |
+-----------------------------+--------------------------+------------------------------+
3 rows in set (0.00 sec)

三、获取年龄

  假设我们有们的表数据如下,先算出他们的年龄。

mysql> SELECT user_code,user_name,birthday FROM tb_student WHERE user_code BETWEEN 6070 AND 6072;
+-----------+-----------+------------+
| user_code | user_name | birthday   |
+-----------+-----------+------------+
|      6070 | 唐静珊    | 2010-05-13 |
|      6071 | 吴恬美    | 2009-02-17 |
|      6072 | 谢骊艳    | 2009-07-08 |
+-----------+-----------+------------+
3 rows in set (0.00 sec)

3.1、方法一

查询语句

SELECT 
    user_code,
    user_name,
    birthday,
    YEAR(FROM_DAYS(DATEDIFF(NOW(), birthday))) AS '方法一age'
FROM
    school.tb_student
WHERE
    user_code BETWEEN 6070 AND 6072;

语法解析

  • NOW() :得到当前日期和时间
  • DATEDIFF(NOW(), birthday) :计算当前日期到出生日期的间隔天数 n
  • FROM_DAYS(n) :计算从 0000 年 1 月 1 日开始 n 天后的日期,比如得到: 0012-10-24 0014-01-17 0013-08-29
  • YEAR() :获取到年数,即年龄

查询结果

+-----------+-----------+------------+--------------+
| user_code | user_name | birthday   | 方法一age    |
+-----------+-----------+------------+--------------+
|      6070 | 唐静珊    | 2010-05-13 |           12 |
|      6071 | 吴恬美    | 2009-02-17 |           14 |
|      6072 | 谢骊艳    | 2009-07-08 |           13 |
+-----------+-----------+------------+--------------+
3 rows in set (0.00 sec)

3.2、方法二

查询语句

SELECT 
    user_code,
    user_name,
    birthday,
    DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW()) - TO_DAYS(birthday)),'%Y') + 0 AS '方法二age'
FROM
    school.tb_student
WHERE
    user_code BETWEEN 6070 AND 6072;

语法解析

  • NOW() :得到当前日期和时间
  • TO_DAYS(NOW()) :把当前日期转成距离 0000 年 1 月 1 日的天数 m
  • TO_DAYS(birthday) :把出生日期转成距离 0000 年 1 月 1 日的天数 n
  • FROM_DAYS(m,n) :计算从 0000 年 1 月 1 日开始 m-n 天后的日期 diff ,比如得到: 0012-10-24 0014-01-17 0013-08-29
  • DATE_FORMAT(diff,‘%Y’) :格式化获取年份,比如得到: 0012 0014 0013
  • 加上 0 自动转为数字年龄

查询结果

+-----------+-----------+------------+--------------+
| user_code | user_name | birthday   | 方法二age    |
+-----------+-----------+------------+--------------+
|      6070 | 唐静珊    | 2010-05-13 |           12 |
|      6071 | 吴恬美    | 2009-02-17 |           14 |
|      6072 | 谢骊艳    | 2009-07-08 |           13 |
+-----------+-----------+------------+--------------+
3 rows in set (0.00 sec)

3.3、方法三( 推荐

查询语句

SELECT 
    user_code,
    user_name,
    birthday,
    TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS '方法三age'
FROM
    school.tb_student
WHERE
    user_code BETWEEN 6070 AND 6072;

语法解析

  • CURDATE() :得到当前日期
  • TIMESTAMPDIFF(YEAR, birthday, CURDATE()) :出生日期和当前日期的年份差值即为年龄

查询结果

+-----------+-----------+------------+--------------+
| user_code | user_name | birthday   | 方法三age    |
+-----------+-----------+------------+--------------+
|      6070 | 唐静珊    | 2010-05-13 |           12 |
|      6071 | 吴恬美    | 2009-02-17 |           14 |
|      6072 | 谢骊艳    | 2009-07-08 |           13 |
+-----------+-----------+------------+--------------+
3 rows in set (0.00 sec)

3.4、方法四

查询语句

SELECT 
    user_code,
    user_name,
    birthday,
    FLOOR(DATEDIFF(CURDATE(), birthday)/365.2422) as '方法四age'
FROM
    school.tb_student
WHERE
    user_code BETWEEN 6070 AND 6072;

语法解析

  • CURDATE() :得到当前日期
  • DATEDIFF(CURDATE(), birthday) :计算当前日期和出生日期的差值整数天 n
  • FLOOR(n/365.2422) :现代人测算得出一年是365.2422日,计算年数后向下取整得到年龄

查询结果

+-----------+-----------+------------+--------------+
| user_code | user_name | birthday   | 方法四age    |
+-----------+-----------+------------+--------------+
|      6070 | 唐静珊    | 2010-05-13 |           12 |
|      6071 | 吴恬美    | 2009-02-17 |           14 |
|      6072 | 谢骊艳    | 2009-07-08 |           13 |
+-----------+-----------+------------+--------------+
3 rows in set (0.00 sec)

四、时间段差异

  • timestampdiff(unit,datetime_expr1,datetime_expr2) 计算时间差,返回 datetime_expr2 − datetime_expr1 的时间差,unit的值可以为:yearmonthdayhourminutesecond

查询语句

SELECT 
    payTime as '支付时间',
    noticeTime as '通知时间',
    timestampdiff(second,payTime,noticeTime) as '时间间隔'
FROM `tb_biz_pay_notice` 
WHERE payTime BETWEEN '2023-03-06 13:30:00' AND '2023-03-06 13:30:05';

查询结果

+---------------------+---------------------+--------------+
| 支付时间            | 通知时间            | 时间间隔     |
+---------------------+---------------------+--------------+
| 2023-03-06 13:30:00 | 2023-03-06 13:30:01 |            1 |
| 2023-03-06 13:30:00 | 2023-03-06 13:30:08 |            8 |
| 2023-03-06 13:30:01 | 2023-03-06 13:30:02 |            1 |
| 2023-03-06 13:30:01 | 2023-03-06 13:30:01 |            0 |
| 2023-03-06 13:30:03 | 2023-03-06 13:30:04 |            1 |
| 2023-03-06 13:30:03 | 2023-03-06 13:30:05 |            2 |
+---------------------+---------------------+--------------+
6 rows in set (0.00 sec)

  一般适合定位两个时间的问题,比如上述有一笔交易支付时间和通知时间差了8秒,就可以去查查是什么原因。或者是用于统计下这些慢通知的比例等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/1683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)

前言:本文为手把手教学ADC采样及各式滤波算法的教程,本教程的MCU采用STM32F103ZET6。以HAL库的ADC采样函数为基础进行教学,通过各式常见滤波的实验结果进行分析对比,搭配VOFA工具直观的展示滤波效果。ADC与滤波算法都是嵌入式较为…

最低仅需一张入门级显卡便可运行扩散模型AI作画——Stable Diffusion Webui试玩体验 文本生成图像扩散模型本机推理

最近在网上发现了一款训练好了的Stable Diffusion 友好的Webui,具有完全免费、离线运行、解压即用、超简单配置、全部汉化、效果惊人的Stable Diffusion Webui项目,在此分享给大家。 在此首先感谢: 大佬原始的webui项目:https:/…

4.网络爬虫—Post请求(实战演示)

网络爬虫—Post请求实战演示POST请求GET请求POST请求和GET请求的区别获取二进制数据爬[百度官网](https://www.baidu.com/)logo实战发送post请求百度翻译实战使用session发送请求模拟登录17k小说网常见问题前言: 📝​📝​此专栏文章是专门针对…

嵌入式硬件电路设计的基本技巧

目录 1 分模块 2 标注关键参数 3 电阻/电容/电感/磁珠的注释 4 可维修性 5 BOM表归一化 6 电源和地的符号 7 测试点 8 网络标号 9 容错性/兼容性 10 NC、NF 11 版本变更 12 悬空引脚 13 可扩展性 14 防呆 15 信号的流向 16 PCB走线建议 17 不使用\表示取反 不…

springboot车辆充电桩

sprinboot车辆充电桩演示录像2022开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:ecli…

从零到Offer -- List的那些事

ArrayList ​ 作为日常最常见的collection对象,相信大家对于ArrayList都不陌生。但是ArrayList的实现你是否又了解呢?开门见山,ArrayList的最底层实现其实就是一个数组: transient Object[] elementData;public ArrayList() {th…

springboot+vue驾校管理系统 idea科目一四预约考试,练车

加大了对从事道路运输经营活动驾驶员的培训管理力度,但在实际的管理过程中,仍然存在以下问题:(1)管理部门内部人员在实际管理过程中存在人情管理,不进行培训、考试直接进行发证。(2)从业驾驶员培训机构不能严格执行管理部门的大纲…

自动驾驶自主避障概况

文章目录前言1. 自主避障在自动驾驶系统架构中的位置2. 自主避障算法分类2.1 人工势场法(APF)2.1.1引力势场的构建2.1.2斥力势场的构建2.1.3人工势场法的改进2.2 TEB(Timed-Eastic-Band, 定时弹性带)2.3 栅格法2.4 向量场直方图(V…

由文心一言发布会引发的思考,聊聊我未来的学习规划

文章目录前言一. 文心一言的试用1.1 文心一言发布会1.2 文心一言图片生成功能试用1.3 文心一言文本功能试用1.4 文心一言代码功能试用1.5 试用总结二. 我未来的学习规划2.1 向csdn的大佬请教2.2 关于AIGC的思考2.3 我未来的学习方向和计划总结前言 大家好,我是沐风…

jvm-题库

1、JVM内存模型 JVM内存区域总共分为两种类型 线程私有区域:程序计数器、本地方法栈和虚拟机栈 线程共享区域:堆(heap)和方法区 特征 线程私有区域:依赖用户的线程创建而创建、销毁而销毁,因用户每次访问都…

图解如何一步步连接远程服务器——基于VScode

基于VScode连接远程服务器 安装Remote-SSH等插件 想要在vscode上连接远程服务器需要下载Remote-SSH系列插件: 直接在插件中搜索remote,即可找到,选择图片中的3个插件,点击install安装。 配置Remote-SSH 在这个步骤有多种操作…

在使用fastjson中遇到的问题

一、在使用fastjson中遇到的问题 导论:最近在写一个JavaFx项目的时候使用到了fastjson作为处理json数据的依赖。在其它非JavaFx项目中也使用到了相同版本的fastjson,但是可以正常运行,而在JavaFx项目中却报异常,刚开始以为是我的依…

Linux网络概述

写咋前面 今天,我们需要初步的认识一下Linux中网络的基本原理,只有大家对这个有一个初步的认识,后面我们学习起来才会更加的简单容易.计算机语言知识那么多,但是Linux不是.面试时,面试官总是会有问题难住你,我们后面需要看看书,这一点非常重要.我们现在谈的是脉络,.是框架.这些…

高通开发系列 - Sensors Bring Up

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回高通开发系列 - 总目录 目录 问题背景高通android sensor信息Sensors Execution Environment (SEE)qxdm抓sensor log的方法android 调试…

Java 中SimpleDateFormat 错误用法及改正

正确用法 1. 每次都 new正确用法 2. 加锁正确用法 3. 使用 ThreadLocal 容器正确用法4. 改用 DateTimeFormatter(推荐)开发 Java 项目时经常操作时间、日期与字符串的互相转换,最常见简单的方式是使用 SimpleDateFormat,想必大家对…

GPT-4 API 接口调用及价格分析

GPT-4 API 接口调用及价格分析 15日凌晨,OpenAI发布了万众期待的GPT-4!新模型支持多模态,具备强大的识图能力,并且推理能力和回答准确性显著提高。在各种专业和学术基准测试上的表现都媲美甚至超过人类。难怪OpenAI CEO Sam Altm…

优思学院|2023年如何成为一名六西格玛黑带?

如果你总感到无论如何努力工作都没有任何进步,我可以告诉你,你并不孤单。 事实上,许多调查报告都显示,惊人的90%的人对自己的工作都不满意,这就是说在你认识的每10个人中,只有1个人对自己的工作感到满意。…

JAVA开发(Spring Gateway 的原理和使用)

在springCloud的架构中,业务服务都是以微服务来划分的,每个服务可能都有自己的地址和端口。如果前端或者说是客户端直接去调用不同的微服务的话,就要配置不同的地址。其实这是一个解耦和去中心化出现的弊端。所以springCloud体系中&#xff0…

初探Gradle

目录一.概述二.优点三.安装与配置1. 官网下载2. 配置环境变量3. 检验4. 配置国内镜像(可选)5. IDEA配置三.工程结构四.生命周期1.Initialization阶段2.Configuration阶段3.Execution阶段五.Task六.常用任务指令七.引入依赖1.本地依赖2.项目依赖3.直接依赖八.依赖类型九.插件十.…

【C语言】数据在内存中的存储

目录 数据类型的介绍 类型的基本归类 整型家族 浮点型家族 构造类型 指针类型 整型在内存中的存储 原码、反码、补码 图例 ​编辑 大/小端存储模式的介绍 大/小端存储模式的概念 大/小端存储模式的意义 图例 浮点型在内存中的存储 单精度浮点数的存储图例 …
最新文章