mysql按日、周、月统计

使用DATE_FORMAT函数格式化日期

语法

DATE_FORMAT(date,format)

date根据format字符串格式化值。

下表中显示的说明符可以在format字符串中使用。%是格式说明符之前的必需字符。

说明符描述
%a工作日的缩写名称(Sun.. Sat)
%b月份缩写名称(Jan.. Dec)
%c月份,数字(0.. 12)
%D带英文后缀的某一天(0th, 1st,2nd, 3rd,…)
%d一个月中的一天,数字(00.. 31)
%e一个月中的一天,数字(0.. 31)
%f微秒(000000.. 999999)
%H小时(00.. 23)
%h小时(01.. 12)
%I小时(01.. 12)
%i分钟,数字(00.. 59)
%j一年中的一天(001.. 366)
%k小时(0.. 23)
%l小时(1.. 12)
%M月份英文名(January.. December)
%m月份,数字(00.. 12)
%pAMPM
%r12小时制时间(hh:mm:ss后跟 AMPM
%S秒(00.. 59)
%s秒(00.. 59)
%T24小时制时间(hh:mm:ss
%U周(00.. 53),其中星期日是一周的第一天; WEEK()模式0
%u周(00.. 53),其中星期一是一周的第一天; WEEK()模式1
%V周(01.. 53),其中星期日是一周的第一天; WEEK()模式2; 用于 %X
%v周(01.. 53),其中星期一是一周的第一天; WEEK()模式3; 用于 %x
%W工作日名称(Sunday.. Saturday)
%w星期几(0=星期天.. 6=星期六)
%X星期的年份,其中星期日是一周的第一天,数字,四位数;用于%V
%x一周的年份,其中星期一是一周的第一天,数字,四位数;用于%v
%Y年,数字(四位数字)
%y年,数字(两位数字)
%%文字%字符
%xx,对于上面未列出的任何 “x

那么,如果按照一定时间间隔统计可以如下实现

最近7日统计

SELECT
    date
FROM
    user_date
WHERE
    date > DATE_SUB(CURDATE(), INTERVAL 7 DAY)
GROUP BY
    date
ORDER BY
    date DESC

最近7周统计

SELECT
    DATE_FORMAT(date,'%Y%u') week,
    USER
FROM
    user_date
WHERE
    date > DATE_SUB(CURDATE(), INTERVAL 7 WEEK)
GROUP BY
    week
ORDER BY
    date DESC

最近6个月统计

SELECT
    DATE_FORMAT(date,'%Y%m') month,
    USER
FROM
    user_date
WHERE
    date > DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY
    month
ORDER BY
    date DESC

这里使用到了DATE_SUB这个函数,它表示从指定开始日期减去之间时间间隔。

语法

DATE_SUB(date,INTERVAL expr unit)

date参数指定开始日期或日期时间值。expr是一个表达式,指定要从开始日期减去的间隔值。expr作为字符串计算;它可以以-开始,表示负间隔。unit是一个关键字,用来指明解释表达式的单位。

如下表介绍每个unit的预期形式。

unit预期expr格式
MICROSECONDMICROSECONDS
SECONDSECONDS
MINUTEMINUTES
HOURHOURS
DAYDAYS
WEEKWEEKS
MONTHMONTHS
QUARTERQUARTERS
YEARYEARS
SECOND_MICROSECOND‘SECONDS.MICROSECONDS’
MINUTE_MICROSECOND‘MINUTES:SECONDS.MICROSECONDS’
MINUTE_SECOND‘MINUTES:SECONDS’
HOUR_MICROSECOND‘HOURS:MINUTES:SECONDS.MICROSECONDS’
HOUR_SECOND‘HOURS:MINUTES:SECONDS’
HOUR_MINUTE‘HOURS:MINUTES’
DAY_MICROSECOND‘DAYS HOURS:MINUTES:SECONDS.MICROSECONDS’
DAY_SECOND‘DAYS HOURS:MINUTES:SECONDS’
DAY_MINUTE‘DAYS HOURS:MINUTES’
DAY_HOUR‘DAYS HOURS’
YEAR_MONTH‘YEARS-MONTHS’

根据此,我们还可以轻松写出一个最近30天的查询统计

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)
如果您觉得本文对您有用,欢迎捐赠或留言~
微信支付
支付宝

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注