mysql把日期相减并按照区间范围统计

本文介绍如何使用MySQL的DATEDIFF和INTERVAL函数计算两个时间字段的差,并将其按区间统计,最后通过ELT函数将数值转换为描述性文本,便于理解和展示。通过具体SQL语句的展示,详细说明了如何从数据表中提取所需信息,进行时间差的计算,分组统计以及结果的图表化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据计算导入时间和审核时间之间的差并且按照时间区间,整理成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图表如下图:
在这里插入图片描述

### MySQL 中用于计算日期差的函数 在 MySQL 数据库中,可以使用 `DATEDIFF` 函数来计算两个日期之间的差异。该函数返回的是两个日期之间相差的天数[^1]。 #### DATEDIFF 函数语法 以下是 `DATEDIFF` 的基本语法: ```sql DATEDIFF(date1, date2) ``` 其中: - `date1` 和 `date2` 是有效的日期日期时间表达式。 - 结果表示 `date1` 和 `date2` 之间的天数差,如果 `date1` 比 `date2` 更晚,则结果为正;反之则为负。 #### 示例代码 下面是一些具体的例子展示如何使用 `DATEDIFF`: ```sql -- 计算 '2023-10-01' 和 '2023-09-01' 之间的天数差 SELECT DATEDIFF('2023-10-01', '2023-09-01') AS DateDifference; -- 返回结果:30 天 -- 如果第一个参数早于第二个参数 SELECT DATEDIFF('2023-08-01', '2023-10-01') AS DateDifference; -- 返回结果:-61 天 ``` 除了 `DATEDIFF`,还可以通过其他方式实现更复杂的日期运算,比如利用 `TIMESTAMPDIFF` 来获取不同单位的时间差(秒、分钟、小时等)。其语法如下所示[^2]: #### TIMESTAMPDIFF 函数语法 ```sql TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2) ``` - `unit`: 时间间隔的单位,支持的选项有 SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 或 YEAR。 - `datetime_expr1`, `datetime_expr2`: 表示要比较的两个有效日期日期时间值。 #### 示例代码 以下是一个基于 `TIMESTAMPDIFF` 的实例: ```sql -- 获取 '2023-10-01' 和当前日期之间的月份数量 SELECT TIMESTAMPDIFF(MONTH, '2023-10-01', CURDATE()) AS MonthDifference; -- 获取 '2023-10-01 12:00:00' 和 '2023-10-02 15:30:00' 之间的小时数量 SELECT TIMESTAMPDIFF(HOUR, '2023-10-01 12:00:00', '2023-10-02 15:30:00') AS HourDifference; ``` 以上展示了两种主要的方法来进行日期间的减法操作以及获得具体的时间差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值