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

求助:SQL查询指定时间范围无结果及LIKE匹配失效问题

解决SQL筛选特定时间段数据的问题

嘿,我来帮你搞定这个SQL查询的问题~核心问题出在你的Sent字段是字符串格式的完整日期时间,直接用字符串比较或简单LIKE匹配根本抓不到你要的时间段,我给你拆解清楚:

为什么之前的方法都失效了?

  • 直接字符串比较Sent >= '08.00' AND Sent < '10:00':你的Sent值是类似"Dec 5, 2017 09:45 AM CET"的完整字符串,字符串排序是按字符顺序来的,"Dec"开头的字符串和"08.00"比,前者会被判定为更大,而且格式也不匹配(字段里是HH:MI AM,你用的是HH.MM),自然查不到结果。
  • LIKE匹配Sent LIKE '%09:00%':这个写法只能精准匹配包含09:00的记录,像08:30、09:45这类符合时间段的记录都会被漏掉。另外,LIKE里的冒号不需要转义,你加的//和()反而让匹配条件变成找包含//09:00//或(09:00)的内容,当然失效了。

正确的解决方案:提取时间部分再比较

根据你用的数据库类型,给你几种常用写法:

如果你用MySQL

用TIME()函数把字符串日期里的时间部分提取出来,再做范围比较:

SELECT * FROM push WHERE TIME(Sent) >= '08:00:00' AND TIME(Sent) < '10:00:00';

MySQL的TIME()函数能自动解析你这种格式的字符串,直接提取时分秒信息。

如果你用SQL Server

通过CAST()把字段转成时间类型后再比较:

SELECT * FROM push WHERE CAST(Sent AS TIME) >= '08:00:00' AND CAST(Sent AS TIME) < '10:00:00';

如果你用PostgreSQL

先把字符串转成时间戳,再提取时间或小时数筛选:

-- 方法1:提取时间字符串后比较
SELECT * FROM push 
WHERE TO_CHAR(TO_TIMESTAMP(Sent, 'Mon DD, YYYY HH:MI AM TZ'), 'HH24:MI:SS') BETWEEN '08:00:00' AND '09:59:59';

-- 方法2:提取小时数判断
SELECT * FROM push 
WHERE EXTRACT(HOUR FROM TO_TIMESTAMP(Sent, 'Mon DD, YYYY HH:MI AM TZ')) BETWEEN 8 AND 9;

额外小建议

如果你的业务经常要按时间维度查数据,强烈建议把Sent字段改成日期时间类型(比如MySQL的DATETIME、SQL Server的DATETIME2、PostgreSQL的TIMESTAMP WITH TIME ZONE),这样不仅查询效率更高,还能避免字符串解析带来的各种坑。

内容的提问来源于stack exchange,提问作者anna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:26:00