MySQL的INTERVAL()函数是用于判断某个值在给定有序列表中的位置的实用函数,将其应用到表的列上,可以快速实现范围匹配、区间分组等业务需求,不需要编写复杂的条件判断语句。

INTERVAL()函数基本语法
INTERVAL()函数的标准语法格式如下:
INTERVAL(N,N1,N2,N3,...)
其中N是要判断的目标值,后面的N1、N2、N3等是有序的数值列表,列表中的元素必须从小到大排列。函数会返回N在有序列表中小于N的最大元素的索引位置,索引从0开始计算。如果N小于所有列表元素,返回0;如果N大于等于最后一个列表元素,返回列表的长度。
对表的数值列使用INTERVAL()函数
假设我们有一张学生成绩表student_score,表结构如下:
CREATE TABLE student_score (
id INT PRIMARY KEY AUTO_INCREMENT,
student_name VARCHAR(50) NOT NULL,
score INT NOT NULL
);
表中插入的测试数据如下:
INSERT INTO student_score (student_name, score) VALUES
('张三', 55),
('李四', 68),
('王五', 82),
('赵六', 91),
('孙七', 76);
现在需要根据score列的分数,将其划分到不同的等级区间:小于60为不及格,60-79为中等,80-89为良好,90及以上为优秀。这时候就可以直接对score列使用INTERVAL()函数:
SELECT
student_name,
score,
INTERVAL(score, 60, 80, 90) AS level_index,
CASE INTERVAL(score, 60, 80, 90)
WHEN 0 THEN '不及格'
WHEN 1 THEN '中等'
WHEN 2 THEN '良好'
WHEN 3 THEN '优秀'
END AS level_desc
FROM student_score;
上述查询中,INTERVAL(score, 60, 80, 90)会先判断score列的值在有序列表[60,80,90]中的位置,返回的索引对应不同的等级区间,再通过CASE语句把索引转换为可读的等级描述。
对表的日期时间列使用INTERVAL()函数
INTERVAL()函数也可以配合日期时间列使用,前提是日期时间可以转换为对应的数值。比如我们有一张订单表order_info,表结构如下:
CREATE TABLE order_info (
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_amount DECIMAL(10,2) NOT NULL,
create_time DATETIME NOT NULL
);
如果要判断订单的创建时间距离当前时间的天数区间,可以先将日期转换为时间戳数值,再使用INTERVAL()函数:
SELECT
order_id,
order_amount,
create_time,
INTERVAL(TIMESTAMPDIFF(DAY, create_time, NOW()), 7, 30, 90) AS day_interval_index
FROM order_info;
这里先用TIMESTAMPDIFF(DAY, create_time, NOW())计算订单创建时间到当前时间的天数差,再把这个差值作为INTERVAL()函数的第一个参数,判断天数差落在7天以内、7-30天、30-90天、90天以上哪个区间。
使用注意事项
- INTERVAL()函数的后续参数列表必须是有序的,否则会返回错误的结果,比如不能写成
INTERVAL(score, 80, 60, 90)这样的无序列表。 - 如果表的列值为NULL,INTERVAL()函数会返回NULL,使用前需要确认列值不存在NULL,或者通过
IFNULL()函数处理NULL值。 - INTERVAL()函数的返回值类型是数值,如果需要更直观的结果,需要配合CASE或者其他转换函数使用。
常见问题解答
INTERVAL()函数和INTERVAL关键字有什么区别?
INTERVAL()是函数,用于判断值的位置;而INTERVAL是关键字,常用于日期时间运算,比如DATE_ADD(NOW(), INTERVAL 1 DAY),二者作用完全不同,不要混淆。
可以对字符串列使用INTERVAL()函数吗?
如果字符串列的内容是数值格式的字符串,MySQL会自动转换为数值再判断,否则会转换为0处理,建议对字符串列使用前先确认内容格式,或者先做类型转换。
MySQLINTERVAL函数表列操作SQL查询修改时间:2026-06-11 02:12:17