如何在SQL查询中结合LIKE与BETWEEN,筛选含时间的可变前缀ID?
当然可以实现!不过得换个思路结合功能
你的需求是要从结构不固定的ID里提取中间的时间部分,再筛选出10分钟内的记录,直接把LIKE和BETWEEN硬凑一起确实不太好使,但我们可以先把时间字符串从ID里抠出来,再做范围判断,下面给你几种实用的方案:
方案一:正则提取时间字符串(推荐)
如果你的数据库支持正则函数(比如MySQL 8.0+、PostgreSQL、SQL Server 2017+),这是最灵活的方式——不管前缀是2位还是4位,直接提取ID里的时间数字段(假设是固定12位的YYMMDDHHMMSS格式),再转成时间类型做比较:
MySQL 示例
SELECT * FROM your_table WHERE STR_TO_DATE(REGEXP_SUBSTR(id, '[0-9]{12}'), '%y%m%d%H%i%s') BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW();
PostgreSQL 示例
SELECT * FROM your_table WHERE TO_TIMESTAMP(SUBSTRING(id FROM '[0-9]{12}'), 'YYMMDDHH24MISS') BETWEEN NOW() - INTERVAL '10 minutes' AND NOW();
SQL Server 示例
SELECT * FROM your_table WHERE CONVERT(DATETIME, SUBSTRING(id, PATINDEX('%[0-9]{12}%', id), 12), 12) BETWEEN DATEADD(MINUTE, -10, GETDATE()) AND GETDATE();
原理:用正则匹配出ID里连续的12位数字(也就是你的时间部分),转换成数据库能识别的时间类型后,再用BETWEEN判断是否在目标时间范围内。
方案二:兼容老版本数据库(无正则支持)
如果你的数据库版本比较老,不支持正则函数,可以通过定位第一个数字的位置来提取时间段:
MySQL 示例
SELECT * FROM your_table WHERE STR_TO_DATE( SUBSTRING(id, REGEXP_INSTR(id, '[0-9]'), 12), '%y%m%d%H%i%s') BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW();
原理:REGEXP_INSTR找到ID里第一个数字的起始位置,从这个位置开始截取12位字符作为时间字符串,再转成时间类型做判断。
不推荐的方案:硬凑LIKE和BETWEEN
你一开始想的直接结合LIKE和BETWEEN其实也能实现,但效率极低——需要生成10分钟内所有可能的时间字符串,然后用OR拼接一堆LIKE '%时间字符串%'的条件,比如:
-- 示例思路,实际要生成所有中间时间,非常繁琐 SELECT * FROM your_table WHERE id LIKE '%2310151400%' OR id LIKE '%2310151401%' -- ... 中间要写满10分钟内的所有分钟字符串 OR id LIKE '%2310151410%';
这种方式不仅写起来麻烦,数据量大的时候查询速度会很慢,所以不建议用。
注意事项
- 确保ID里的时间格式是统一的(比如都是12位的
YYMMDDHHMMSS),如果是14位的YYYYMMDDHHMMSS,记得把正则里的{12}改成{14},同时调整日期转换的格式符。 - 如果ID里存在多个12位数字段,正则提取会取第一个匹配的,所以要保证时间部分是ID里唯一的长数字段。
内容的提问来源于stack exchange,提问作者Caffeine_Intensifies
相关产品推荐
相关产品推荐

