MySQL的DATE_FORMAT函数的使用

作者:_陈哈哈 时间:2024-01-18 09:52:28 

假设某宝为鼓励大家双12买买买,奖励双十一那天订单最多的两位用户:分别是用户1:“剁手皇帝陈哈哈” 和 用户2:“触手怪刘大莉” 一人一万元;

需求1:让你通过MySQL订单表,统计一下双11那天,这两位每小时的购买订单成交数;你会怎么写这条SQL呢?

记得几年前我刚接触MySQl,年少轻狂,在得知不用考虑效率的情况下,我写了个接口循环二十四遍,发送24条SQL去查(捂脸),由于那个接口,被技术经理嘲讽~~表示他写的SQL比我吃的米都多。虽然我们山东人基本不吃米饭,但我还是羞愧不已。。

然后经理通过调用一个DATE_FORMAT函数分组查询处理一下,就ok了,效率是我的几十倍吧。从那时起,我暗自计划要深入研究SQL技巧。

第二天,由于和朋友开黑打了两把王者,计划延后了几年~

在MySQL中对于处理时间字段,有专门封装的DATE_FORMAT函数,可以说,DATE_FORMAT函数可以基本满足任何时间字段的处理需求。

DATE_FORMAT(date,format) 函数

参数解析:

1、date:代表具体时间字段,也可以为now()查询当前时间;
2、format:DATE_FORMAT将传来的Date类型数据转为自己需要的格式,如%Y-%m-%d %H:%i:%s会将传来的Time数据转为"yyyy-MM-dd HH:mm:ss"格式
%Y-%m-%d %H:%i:%s 与 yyyy-MM-dd HH:mm:ss 相对应,也是最常用的格式,这里举几个简单的栗子如下;


SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');  -- 结果:2020-12-07 22:18:58
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i');   -- 结果:2020-12-07 22:18
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H');     -- 结果:2020-12-07 22
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');      -- 结果:2020-12-07
SELECT DATE_FORMAT(NOW(),'%H:%i:%s');      -- 结果:22:18:58
SELECT DATE_FORMAT(NOW(),'%H');         -- 结果:22

对于上面的需求1,用DATE_FORMAT函数的查询方式如下:


SELECT name as '用户名',DATE_FORMAT(createTime,'%Y-%m-%d %H') as '时间/小时',count(*) as '订单量' from t_order
where DATE_FORMAT(createTime,'%Y-%m-%d') = '2020-11-11'
 GROUP BY DATE_FORMAT(createTime,'%Y-%m-%d %H');

查询结果:


mysql> SELECT name as '用户名',DATE_FORMAT(createTime,'%Y-%m-%d %H') as '时间/小时',count(*) as '订单量' from t_order where DATE_FORMAT(createTime,'%Y-%m-%d') = '2020-11-11' GROUP BY DATE_FORMAT(createTime,'%Y-%m-%d %H');
+------------------+---------------+-----------+
| 用户名      | 时间/小时   | 订单量  |
+------------------+---------------+-----------+
| 剁手皇帝陈哈哈  | 2020-11-11 00 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 01 |    10 |
| 剁手皇帝陈哈哈  | 2020-11-11 02 |    6 |
| 剁手皇帝陈哈哈  | 2020-11-11 03 |    3 |
| 剁手皇帝陈哈哈  | 2020-11-11 04 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 05 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 06 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 07 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 08 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 09 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 10 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 11 |    0 |
| 剁手皇帝陈哈哈  | 2020-11-11 12 |    12 |
| 剁手皇帝陈哈哈  | 2020-11-11 13 |    6 |
| 剁手皇帝陈哈哈  | 2020-11-11 14 |    3 |
| 剁手皇帝陈哈哈  | 2020-11-11 15 |    7 |
| 剁手皇帝陈哈哈  | 2020-11-11 16 |    2 |
| 剁手皇帝陈哈哈  | 2020-11-11 17 |    3 |
| 剁手皇帝陈哈哈  | 2020-11-11 18 |    11 |
| 剁手皇帝陈哈哈  | 2020-11-11 19 |    2 |
| 剁手皇帝陈哈哈  | 2020-11-11 20 |    1 |
| 剁手皇帝陈哈哈  | 2020-11-11 21 |    3 |
| 剁手皇帝陈哈哈  | 2020-11-11 22 |    2 |
| 剁手皇帝陈哈哈  | 2020-11-11 23 |    0 |
+------------------+---------------+-----------+
24 rows in set (0.00 sec)

这里的GROUP BY DATE_FORMAT(createTime,'%Y-%m-%d %H')代表的是“年月日 + 小时”合在一起为单位,具体到的是某天的小时;

当然,也可以写成以下两种形式,都是按小时来划分,但是…:

1、GROUP BY DATE_FORMAT(createTime,'%H')
2、GROUP BY HOUR(createTime)
需要注意的是,当where条件指定了某一天时,这三种的作用是相同的,但如果where条件没指定某一天,就会大不相同,我们来看看查询结果;


SELECT name as '用户名',DATE_FORMAT(createTime,'%H') as '时间/小时',count(*) as '订单量' from t_order
GROUP BY DATE_FORMAT(createTime,'%H');

查询结果


mysql> SELECT name as '用户名',DATE_FORMAT(createTime,'%H') as '时间/小时',count(*) as '订单量' from t_order GROUP BY DATE_FORMAT(createTime,'%H');
+-----------------+---------------+-----------+
| 用户名     | 时间/小时   | 订单量  |
+-----------------+---------------+-----------+
| 触手怪刘大莉  |      00 |   11  |
| 触手怪刘大莉  |      01 |   302 |
| 触手怪刘大莉  |      02 |   277 |
| 触手怪刘大莉  |      03 |   122 |
| 触手怪刘大莉  |      04 |   6  |
| 触手怪刘大莉  |      05 |   11  |
| 触手怪刘大莉  |      06 |   0  |
| 触手怪刘大莉  |      07 |   0  |
| 触手怪刘大莉  |      08 |   1  |
| 触手怪刘大莉  |      09 |   4  |
| 触手怪刘大莉  |      10 |   5  |
| 触手怪刘大莉  |      11 |   92  |
| 触手怪刘大莉  |      12 |   1937 |
| 触手怪刘大莉  |      13 |   1602 |
| 触手怪刘大莉  |      14 |   108 |
| 触手怪刘大莉  |      15 |   78  |
| 触手怪刘大莉  |      16 |   110 |
| 触手怪刘大莉  |      17 |   108 |
| 触手怪刘大莉  |      18 |   138 |
| 触手怪刘大莉  |      19 |   66  |
| 触手怪刘大莉  |      20 |   44  |
| 触手怪刘大莉  |      21 |   59  |
| 触手怪刘大莉  |      22 |   21  |
| 触手怪刘大莉  |      23 |   8  |
+-----------------+---------------+-----------+
24 rows in set (0.01 sec)

通过查询结果可以看出,查出的数据是用户历史所有的订单数在各小时的分布情况,DATE_FORMAT(createTime,'%H')代表的是是任意天的小时,也等价于GROUP BY HOUR(createTime)。

拿到这些数据,相信写推荐算法的同学就知道在哪个时间段给“触手怪刘大莉”同学推广告的效果最好了。

来源:https://blog.csdn.net/qq_39390545/article/details/110846666

标签:MySQL,DATE,FORMAT
0
投稿

猜你喜欢

  • 懒懒交流会:ClassName的长命名 VS. 短命名

    2009-11-28 16:08:00
  • python多线程扫描端口示例

    2022-06-28 23:18:58
  • Go 语言 IDE 中的 VSCode 配置使用教程

    2024-02-20 23:27:36
  • 15个设计得最糟糕最变态的CAPTCHA验证码

    2008-09-01 17:17:00
  • Python实现消消乐小游戏

    2021-02-19 19:37:42
  • python 返回列表中某个值的索引方法

    2021-05-25 21:44:13
  • vue-cli 首屏加载优化问题

    2024-05-29 22:48:54
  • vue $mount 和 el的区别说明

    2024-04-28 09:20:24
  • python自动化测试之如何解析excel文件

    2022-08-28 08:24:36
  • python简单猜数游戏实例

    2023-10-05 21:31:55
  • Python 内置函数globals()和locals()对比详解

    2021-07-03 18:57:41
  • JS+ASP实现无刷新新闻列表方法

    2007-08-22 12:44:00
  • git设置忽略文件.gitignore的方法

    2023-05-18 02:12:19
  • golang简单读写文件示例

    2024-05-22 10:13:21
  • Django压缩静态文件的实现方法详析

    2023-06-15 05:31:33
  • 对python中基于tcp协议的通信(数据传输)实例讲解

    2023-04-18 14:36:10
  • MySQL里实现类似SPLIT的分割字符串的函数

    2024-01-22 15:41:54
  • javascript获取本机操作系统类型的方法

    2024-04-17 10:00:24
  • python selenium在打开的浏览器中动态调整User Agent

    2022-09-26 13:41:59
  • BOF、EOF 属性

    2009-05-11 12:37:00
  • asp之家 网络编程 m.aspxhome.com