MySQL的DATE_FORMAT函数的使用

假设某宝为鼓励大家双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)。

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

到此这篇关于MySQL的DATE_FORMAT函数的使用的文章就介绍到这了,更多相关MySQL DATE_FORMAT内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL中DATE_FORMATE函数使用时的注意点

    今天帮同事处理一个SQL(简化过后的)执行报错: mysql> select date_format('2013-11-19','Y-m-d') > timediff('2013-11-19', '2013-11-20'); ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) for operation '>' 乍一看挺莫名其妙的

  • Mysql 日期时间 DATE_FORMAT(date,format)

    本文转自:http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html#function_date-format DATE_FORMAT(date,format) Formats the date value according to the format string. The following specifiers may be used in the format string. As of MySQL 3.23,

  • MySQL的时间差函数(TIMESTAMPDIFF、DATEDIFF)、日期转换计算函数(date_add、day、date_format、str_to_date)

    1. 时间差函数(TIMESTAMPDIFF.DATEDIFF) 需要用MySQL计算时间差,使用TIMESTAMPDIFF.DATEDIFF,记录一下实验结果 --0 select datediff(now(), now()); --2 select datediff('2015-04-22 23:59:00', '2015-04-20 00:00:00'); --2 select datediff('2015-04-22 00:00:00', '2015-04-20 23:59:00');

  • mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数

    from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串 后面的 '%Y%m%d' 主要是将返回值格式化 例如: mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y%m%d' ) ->20071120 mysql>SELECT FROM_UNIXTIME( 1249488000, '%Y年%m月%d' ) ->2007年11月20 UNIX_TI

  • MySql用DATE_FORMAT截取DateTime字段的日期值

    用 DATE_FORMAT 来格式化日期字段 SELECT DATE_FORMAT(crt_time,'%Y-%m-%d') FROM ad_n_advertise_t

  • MySQL的DATE_FORMAT函数的使用

    假设某宝为鼓励大家双12买买买,奖励双十一那天订单最多的两位用户:分别是用户1:"剁手皇帝陈哈哈" 和 用户2:"触手怪刘大莉" 一人一万元: 需求1:让你通过MySQL订单表,统计一下双11那天,这两位每小时的购买订单成交数:你会怎么写这条SQL呢? 记得几年前我刚接触MySQl,年少轻狂,在得知不用考虑效率的情况下,我写了个接口循环二十四遍,发送24条SQL去查(捂脸),由于那个接口,被技术经理嘲讽~~表示他写的SQL比我吃的米都多.虽然我们山东人基本不吃米饭,

  • MySQL中DATE_FORMAT()函数将Date转为字符串

    目录 一.前言 二.DATE_FORMAT()函数 三.示例 1> %Y/%m/%d 2> %Y-%m-%d 3> %e/%c/%Y 4> %d/%m/%Y %H:%i 5> %b %d %Y %h:%i %p 6> %Y-%m-%d %T:%f 7> %W %D %M %Y %T 总结 一.前言 最近要做一些报表,其中有一个创建报表的时间,需要以固定的格式输出:那么在SQL层面如何处理呢? 二.DATE_FORMAT()函数 要将日期值格式化为特定格式,可以使用

  • MySQL日期格式化yyyy-mm-dd详解(DATE_FORMAT()函数)

    目录 一.前言 二. DATE_FORMAT() 函数 和 NOW() 函数 三.UNIX_TIMESTAMP() 函数 和 FROM_UNIXTIME() 函数 四.拿来就用 总结 一.前言 本文你将会学到: DATE_FORMAT() 函数 NOW() 函数 UNIX_TIMESTAMP() 函数 FROM_UNIXTIME() 函数 二. DATE_FORMAT() 函数 和 NOW() 函数 DATE_FORMAT() 函数用于将指定的日期格式化为给定的格式值,即将给出一个日期,该函数将

  • 基于mysql时间处理函数的应用详解

    DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, --7=星期六).这些索引值对应于ODBC标准.  mysql> select DAYOFWEEK('1998-02-03');  -> 3 WEEKDAY(date)  返回date的星期索引(0=星期一,1=星期二, --6= 星期天).  mysql> select WEEKDAY('1997-10-04 22:23:00');  -> 5  mysql> select WEEKDAY

  • MySQL的Data_ADD函数与日期格式化函数说明

    DATE_ADD(date,INTERVAL expr type) DATE_SUB(date,INTERVAL expr type) 这些函数执行日期运算. date 是一个 DATETIME 或DATE值,用来指定起始时间. expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值.  Expr是一个字符串;对于负值的时间间隔,它可以以一个 '-'开头. type 为关键词,它指示了表达式被解释的方式. 关键词INTERVA及 type 分类符均不区分大小写. 以下表显示了type

  • MySQL常用时间函数详解(推荐)

    2.6 DATE_SUB/DATE_ADD DATE_SUB(date,INTERVAL expr type) date 参数是合法的日期表达式.expr 参数是您希望添加的时间间隔. SELECT id FROM my_table WHERE create_time >= date_sub(now(), INTERVAL 3 HOUR) AND create_time < now(); Type 值 •MICROSECOND •SECOND •MINUTE •HOUR •DAY •WEEK

  • 解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别

    mysql 中:UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)若无参数调用,则返回一个Unix timestamp ('1970-01-01 00:00:00' GMT 之后的秒数) 作为无符号整数.若用date 来调用UNIX_TIMESTAMP(),它会将参数值以'1970-01-01 00:00:00' GMT后的秒数的形式返回.date 可以是一个DATE 字符串.一个 DATETIME字符串.一个 TIMESTAMP或一个当地时间的YYMMDD 或YYYM

  • MySql 中聚合函数增加条件表达式的方法

    Mysql 与聚合函数在一起时候where条件和having条件的过滤时机 where 在聚合之前过滤 当一个查询包含了聚合函数及where条件,像这样的情况 select max(cid) from t where t.id<999 这时候会先进行过滤,然后再聚合.先过滤出ID<999的记录,再查找最大的cid返回. having 在聚合之后过滤 having在分组的时候会使用,对分组结果进行过滤,通常里面包含聚合函数. SELECT ip,MAX(id) FROM app GROUP BY

  • 一篇文章搞定Mysql日期时间函数

    前言 日期和时间函数部分也是我们日常工作中使用频率比较高的一部分.这一篇我们主要讲讲Mysql里面的日期时间相关的函数,不同数据库之间基本相同,只会有个别函数的差异.大家掌握一个数据库的,其他的遇到不会的,直接查就可以了. 1.获取当前时刻时间 1.1返回当前时刻的日期和时间 1.2获取当前时刻的日期 1.3获取当前时刻的时间 1.4获取当前时刻的周数 2.日期时间格式转换 3.日期时间运算 3.1向后偏移时间 3.2向前偏移时间 3.3两日期做差 文章较长,建议先收藏,慢慢读. 1.获取当前时

随机推荐