如何编写SQL过滤条件,筛选当日0点至22点的数据?
SQL 当日凌晨0点至22点数据过滤方案
你的核心需求是筛选当日从凌晨0点开始,到晚上10点(22:00)结束的数据,原代码里的getdate()问题在于它返回当前精确时间(含时分秒),无法定位到当日起始点,下面针对主流数据库给出精准实现方案:
SQL Server 实现
WHERE date >= CAST(GETDATE() AS DATE) AND date < DATEADD(HOUR, 22, CAST(GETDATE() AS DATE))
CAST(GETDATE() AS DATE)会把当前时间截断为日期类型,再隐式转回datetime后就是当日凌晨0点(YYYY-MM-DD 00:00:00.000)DATEADD(HOUR, 22, ...)在当日0点基础上加22小时,得到当日22:00:00的时间点,用<而非<=可以避免包含22:00:00及之后的数据
MySQL 实现
WHERE date >= CURDATE() AND date < DATE_ADD(CURDATE(), INTERVAL 22 HOUR)
CURDATE()直接返回当前日期,转成datetime后对应当日0点DATE_ADD(CURDATE(), INTERVAL 22 HOUR)生成当日22:00的时间点,同样用<确保只包含22点前的数据
PostgreSQL 实现
WHERE date >= CURRENT_DATE AND date < CURRENT_DATE + INTERVAL '22 hours'
CURRENT_DATE返回当前日期,与timestamp类型字段比较时会自动补全为当日0点CURRENT_DATE + INTERVAL '22 hours'生成当日22:00的时间戳,<保证过滤范围截止到21:59:59.999
关键说明
- 采用
>= 起始时间+< 结束时间的写法,无论你的date字段是datetime、timestamp还是带毫秒的时间类型,都能精准过滤到目标时间段内的所有数据 - 如果你的
date字段仅存储日期(无时分秒),那需求中的“截至晚上10点”等价于筛选当日所有数据,此时直接用date = CAST(GETDATE() AS DATE)(对应SQL Server)即可
内容的提问来源于stack exchange,提问作者Eduardo Valentim
相关产品推荐
相关产品推荐

