mysql 如何按照时间周期分组统计?大神求教啊。

嗯... 你这个 SQL 语句... 看着有点乱啊。

你写的这个,是想算从 2 01 5 -01 -01 开始,每隔 5 天,每个时间段里有多少条记录对吧?
这个 datediff(dt, '2 01 5 -01 -01 ') div 5 这部分,是想算出每个日期距离起始日多少个 5 天的区间,对吧?这个 div 是整数除法?
然后 group by 就按这个区间分组,count() 就是数每个组里有多少条记录。

但是... asd5 这是什么意思?是 d5 吗?这写法太奇怪了,看不懂。

你可能是想用 d5 作为分组后的那个字段名?如果这样的话,SQL 应该是:
sql select datediff(dt, '2 01 5 -01 -01 ') div 5 as d5 , count() from your_table group by (datediff(dt, '2 01 5 -01 -01 ') div 5 )
你看这样是不是清楚点?把那个奇怪的 asd5 改成 d5
你那个 div 如果在标准的 SQL 里,可能得用 / 然后用 floor() 函数处理。
不过很多数据库系统好像直接支持整数除法 div?得看你用的具体是什么数据库了。

假设你用的是 MySQL 或者类似的,这个写法理论上... 应该能跑吧?就是把日期差分成几段,然后数每段有多少条。

你要是再不确定,可以把你用的是什么数据库说清楚。

MySQL如何获取一年的第几周mysql一年第几周

直接用WEEK()函数。

SELECT WEEK('2 02 3 -1 1 -1 5 ', 1 );
结果是4 5
这就是结果。

MySQL星期函数的使用方法详解MySQL下星期函数

MySQL里的星期函数确实挺实用的。
主要就俩个函数,WEEK和DAYOFWEEK。

WEEK函数咋用呢?就是WEEK(date[,mode])。
date就是个日期,比如'2 02 2 -01 -02 '。
mode是可选的,0到7 之间。
默认是0。
mode=0的时候,特别要注意,是从下一年度的第一个星期开始算的,比如2 02 3 年的第一个星期是1 号,那2 02 2 年1 2 月3 1 号就是Week 1 mode=1 的话,就是从当年1 月1 号开始算。
其他mode就是类似变化。

DAYOFWEEK(date)这个更简单,直接告诉你星期几。
1 是星期日,2 是星期一,一直到7 是星期六。
比如DAYOFWEEK('2 02 2 -01 -02 ')结果是3 ,那就是星期三。

举个例子。
有个表orders,就三列,id,product_name,order_date。
插入几条数据:
sql INSERT INTO orders (product_name,order_date) VALUES ('producta','2 02 2 -01 -02 '), ('productb','2 02 2 -01 -03 '), ('productc','2 02 2 -01 -04 '), ('productd','2 02 2 -01 -05 '), ('producte','2 02 2 -01 -06 ');
现在想统计每周的销售额。
可以这么写SQL:
sql SELECT CONCAT('Week', WEEK(order_date)) AS week, SUM(price) AS sales FROM orders WHERE DATE_FORMAT(order_date, '%Y') = '2 02 2 ' GROUP BY CONCAT('Week', WEEK(order_date)) ORDER BY WEEK(order_date);
注意这里用了WEEK函数来分组。
结果会按周数来排。
你看,因为只插了1 月份数据,结果就是5 2 周,但销售额都是0。
你要是再插点数据,比如1 月1 0号卖了个东西,价格1 00块,那Week 2 的销售就会变成1 00。

说实话,用WEEK函数的时候,mode参数容易搞混。
特别是mode=0和mode=1 的区别。
我当时也没想明白为啥要分这么细,后来查了资料才知道,是为了兼容不同地区的周计算习惯。
比如有些地方认为1 月1 号是Week 1 ,有些地方认为1 月8 号才是Week 1
DAYOFWEEK函数就简单多了,直接告诉你星期几。
不过要注意,它返回的是1 到7 ,不是我们平时说的星期一、二、三这种。
要转成我们习惯的,可以自己加1 ,或者用其他方法。

总之,这两个函数在处理日期相关问题时挺方便的。
但用的时候得细心,特别是WEEK函数的mode参数,别搞错了。