mysql把日期相減並按照區間範圍統計

數據計算導入時間和審覈時間之間的差並且按照時間區間,整理成excel畫出圖表。
在這裏插入圖片描述
關鍵的表字段如上圖所示。

首先兩個日期的加減涉及到mysql的函數datediff(),可以計算出兩者之間的差值

SELECT
	fk_comp_id,
	datediff(
		LEFT (f_create_time, 8),
		LEFT (f_date, 8)
	)
FROM
	t_athlete_score
WHERE
	f_year = 2019
GROUP BY
	fk_comp_id

然後計算差值在什麼範圍之內,使用到mysql的函數INTERVAL(),INTERVAL()函數進行比較列表(N1,N2,N3等等)中的N值。該函數如果N<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。如果N爲NULL,它將返回-1。列表值必須是N1<N2<N3的形式才能正常工作。下面的代碼是顯示 INTERVAL()函數如何工作的一個簡單的例子:

mysql>SELECT INTERVAL(6,1,2,3,4,5,6,7,8,9,10);
+---------------------------------------------------------+
| INTERVAL(6,1,2,3,4,5,6,7,8,9,10)                        |
+---------------------------------------------------------+
| 6                                                       |
+---------------------------------------------------------+
1 row in set (0.00 sec)

結果中,6是從零開始的索引,列表第一個值的值大於N. 在我們的例子中,6 屬於 [6,7) ,所以返回第6個索引

sql可以演化爲:


SELECT
	
		INTERVAL (
			datediff(
				LEFT (f_create_time, 8),
				LEFT (f_date, 8)
			),
			0,
			10,
			20,
			30,
			40,
			50,
			60,
			70,
			80,
			90,
			100,
			110,
			120
		) AS dayNumber,
	fk_comp_id,
	datediff(
		LEFT (f_create_time, 8),
		LEFT (f_date, 8)
	)
FROM
	t_athlete_score
WHERE
	f_year = 2019
GROUP BY
	fk_comp_id

查詢出來的結果,如圖所示:
在這裏插入圖片描述
然後爲了能更好看,表達的更清晰一點,可以使用ELT()函數,將每個值賦予意義,ELT(n,str1,str2,str3,…) :如果n=1,則返回str1,如果n=2,則返回str2,依次類推。如果n小於1或大於參數個數,返回NULL。

mysql> SELECT ELT(3,'hello','halo','test','world');
+--------------------------------------+
| ELT(3,'hello','halo','test','world') |
+--------------------------------------+
| test                                 |
+--------------------------------------+
1 row in set

此時,mysql的SQL語句演變爲:

SELECT
	ELT(INTERVAL(datediff(LEFT (f_create_time, 8),LEFT (f_date, 8)),0,10,20,30,40,50,60,70,80,90,100,110,120),'<=10','10<x<=20','20<x<=30','30<x<=40','40<x<=50','50<x<=60','60<x<=70','70<x<=80','80<x<=90','90<x<=100','100<x<=110','110<x<=120','x>=120') as dayNumber,
	fk_comp_id,
datediff(LEFT (f_create_time, 8),LEFT (f_date, 8))
FROM
	t_athlete_score
WHERE
	f_year = 2019
GROUP BY
	fk_comp_id

然後統計每個區間的個數,sql演化爲:

select m.dayNumber,count(fk_comp_id) from (
SELECT
	ELT(
		INTERVAL (
			datediff(
				LEFT (f_create_time, 8),
				LEFT (f_date, 8)
			),
			0,
			10,
			20,
			30,
			40,
			50,
			60,
			70,
			80,
			90,
			100,
			110,
			120
		),
		'<=10',
		'10<x<=20',
		'20<x<=30',
		'30<x<=40',
		'40<x<=50',
		'50<x<=60',
		'60<x<=70',
		'70<x<=80',
		'80<x<=90',
		'90<x<=100',
		'100<x<=110',
		'110<x<=120',
		'x>=120'
	) AS dayNumber,
	fk_comp_id,
	datediff(
		LEFT (f_create_time, 8),
		LEFT (f_date, 8)
	),INTERVAL (
			datediff(
				LEFT (f_create_time, 8),
				LEFT (f_date, 8)
			),
			0,
			10,
			20,
			30,
			40,
			50,
			60,
			70,
			80,
			90,
			100,
			110,
			120
		) as orderindex
FROM
	t_athlete_score
WHERE
	f_year = 2019
GROUP BY
	fk_comp_id
) as m GROUP BY m.dayNumber ORDER BY m.orderindex

查詢出來的結果爲:
在這裏插入圖片描述
將查詢結果,做成excel圖表如下圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章