有没有遇到过类似这样的问题,将日期 ‘2023-02-23‘ 的格式转化为 202302的格式。
可能有些小伙伴,会直接想到字符串拼接 concat(year(2023-02-23),month(2023-02-23))得到的也是 202302。那要是要求必须是时间格式呢,可能有些小伙伴会说再将其转为时间格式,这样就太麻烦了。
日期格式化
DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式。
常见的使用的格式有:
| 描述 | |
|---|---|
| %Y | 年,4 位 |
| %y | 年,2 位 |
| %M | 月名 |
| %b | 缩写月名 |
| %m | 月,数值(00-12) |
| %c | 月,数值 |
| %W | 星期名 |
| %a | 缩写星期名 |
| %d | 月的天,数值(00-31) |
| %e | 月的天,数值(0-31) |
| %j | 年的天 (001-366) |
| %w | 周的天 (0=星期日, 6=星期六) |
| %H | 小时 (00-23) |
| %h | 小时 (01-12) |
| %i | 分钟,数值(00-59) |
| %S | 秒(00-59) |
| %s | 秒(00-59) |
| %f | 微秒 |
| %p | AM 或 PM |
| %r | 时间,12-小时(hh:mm:ss AM 或 PM) |
| %T | 时间, 24-小时 (hh:mm:ss) |
栗子
平均活跃天数和月活人数_牛客题霸_牛客网 (nowcoder.com)
请计算2021年每个月里试卷作答区用户平均月活跃天数avg_active_days和月度活跃人数mau,
上面数据的示例输出如下:
| month | avg_active_days | mau |
| 202107 | 1.50 | 2 |
| 202109 | 1.25 | 4 |
解释:2021年7月有2人活跃,共活跃了3天(1001活跃1天,1002活跃2天),平均活跃天数1.5;2021年9月有4人活跃,共活跃了5天,平均活跃天数1.25,结果保留2位小数。
注:此处活跃指有交卷行为。
建表语句:
drop table if exists exam_record;
CREATE TABLE exam_record (id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',uid int NOT NULL COMMENT '用户ID',exam_id int NOT NULL COMMENT '试卷ID',start_time datetime NOT NULL COMMENT '开始时间',submit_time datetime COMMENT '提交时间',score tinyint COMMENT '得分'
)CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO exam_record(uid,exam_id,start_time,submit_time,score) VALUES
(1001, 9001, '2021-07-02 09:01:01', '2021-07-02 09:21:01', 80),
(1002, 9001, '2021-09-05 19:01:01', '2021-09-05 19:40:01', 81),
(1002, 9002, '2021-09-02 12:01:01', null, null),
(1002, 9003, '2021-09-01 12:01:01', null, null),
(1002, 9001, '2021-07-02 19:01:01', '2021-07-02 19:30:01', 82),
(1002, 9002, '2021-07-05 18:01:01', '2021-07-05 18:59:02', 90),
(1003, 9002, '2021-07-06 12:01:01', null, null),
(1003, 9003, '2021-09-07 10:01:01', '2021-09-07 10:31:01', 86),
(1004, 9003, '2021-09-06 12:01:01', null, null),
(1002, 9003, '2021-09-01 12:01:01', '2021-09-01 12:31:01', 81),
(1005, 9001, '2021-09-01 12:01:01', '2021-09-01 12:31:01', 88),
(1006, 9002, '2021-09-02 12:11:01', '2021-09-02 12:31:01', 89),
(1007, 9002, '2020-09-02 12:11:01', '2020-09-02 12:31:01', 89);
题解:
select date_format(submit_time,'%Y%m') as month,round((count( distinct uid,date_format(submit_time, '%y%m%d'))) / count(distinct uid),2) as avg_active_days,count(distinct uid) as mau
from exam_record
where submit_time is not null and year(submit_time)=2021
group by date_format(submit_time, '%Y%m')