如何提取SQL数据库表中时间为每日7点、19点的数据记录
问题原因
你之前写的LIKE筛选语句无法返回正确结果,核心问题有两个:
- 你存储的日期时间值精度到7位小数秒,格式为
yyyy-MM-dd HH:mm:ss.fffffff,原筛选规则'%s%s%s%s%s%s%s%s%s%s 07:00:00'既写了无意义的%s占位符,也没有匹配秒后面的小数部分,自然无法命中对应记录。 - 对日期类型字段直接用LIKE做字符串匹配本身就是不推荐的写法:一方面会导致数据库无法使用Date字段上的索引,在实时运行的生产表上查询效率极低;另一方面可能因为数据库的日期隐式转换规则变动,出现意外的匹配错误。
正确实现方案
优先使用原生日期时间函数做筛选,稳定可靠且查询效率更高,以下是不同场景的可用写法:
通用标准写法(兼容MySQL 8.0+、PostgreSQL、Oracle等主流数据库)
通过EXTRACT函数提取时间的小时、分钟、秒部分做判断,精准匹配7点、19点的整点记录:
SELECT * FROM table_name WHERE EXTRACT(HOUR FROM Date) IN (7, 19) AND EXTRACT(MINUTE FROM Date) = 0 AND CAST(EXTRACT(SECOND FROM Date) AS INT) = 0
SQL Server适配写法
从你给出的7位小数秒精度判断,你使用的大概率是SQL Server的datetime2类型,可以用DATEPART函数实现筛选:
SELECT * FROM table_name WHERE DATEPART(HOUR, Date) IN (7, 19) AND DATEPART(MINUTE, Date) = 0 AND DATEPART(SECOND, Date) = 0
修正后的LIKE写法(仅建议临时验证用,不推荐生产环境使用)
如果一定要用LIKE做匹配,需要补全对小数秒部分的匹配规则:
SELECT * FROM table_name WHERE Date LIKE '% 07:00:00.%' OR Date LIKE '% 19:00:00.%'
补充说明
如果你的表中时间记录存在秒级偏差(比如实际存储为07:00:02、18:59:57这类接近整点的数值),直接判断时分秒为0会漏数,可以先把时间截断到小时维度再做匹配,以SQL Server为例:
SELECT * FROM table_name WHERE DATEPART(HOUR, DATEADD(MINUTE, DATEDIFF(MINUTE, 0, Date)/60*60, 0)) IN (7,19)
这种写法会把前后偏差半小时内的记录都对齐到整点,匹配到对应时段的记录。
内容的提问来源于stack exchange,提问作者Gracella Q Sumarlin
相关产品推荐
相关产品推荐

