You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:19:20