SQLite按DateTime字段小时筛选无结果,求正确实现方法
解决SQLite查询8-15点到店客户的问题
你的查询语句没返回结果,核心问题出在strftime('%H','08')的用法错误上,另外时间比较的逻辑也需要调整。我帮你拆解问题并给出正确的写法:
原语句的问题
strftime('%H', '08')是错误的用法:SQLite的strftime函数第二个参数必须是合法的日期时间字符串(比如'2024-05-20 08:30:00'),而单纯的'08'不符合格式,这个调用会返回NULL。你用TIME(date)和NULL做比较,结果永远是未知,自然查不到任何数据。- 直接用
TIME(date)(返回'hh:mm:ss'格式)和小时字符串(比如'08')比较,字符串逻辑会出问题:比如'08:00:00'和'08'比较时,因为长度不同,结果不符合预期。
正确的查询写法
这里提供两种可靠的方案,你可以根据习惯选择:
方案1:提取小时部分做比较
用strftime('%H', date)提取date字段的两位小时字符串(比如'08'、'14'),直接和目标小时范围比较:
SELECT * FROM Clients WHERE strftime('%H', date) >= '08' AND strftime('%H', date) < '15';
如果需要包含15点整的记录,把< '15'改成<= '15'即可。
方案2:直接比较完整时间字符串
用TIME(date)获取date的时间部分('hh:mm:ss'),和完整的时间阈值比较:
SELECT * FROM Clients WHERE TIME(date) >= '08:00:00' AND TIME(date) < '15:00:00';
这种写法更直观,能精确控制到分钟秒的范围。
验证方法
你可以先单独运行SELECT strftime('%H','08');,会发现返回的是NULL,这就是原语句失效的原因。换成SELECT strftime('%H', '2024-05-20 08:30:00');就能得到正确的'08'。
内容的提问来源于stack exchange,提问作者Pedro Palermo
相关产品推荐
相关产品推荐

