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

PostgreSQL跨天时间区间判断BETWEEN语句返回结果异常问题

SQL判断跨午夜时间区间的正确方法

错误原因

你使用的BETWEEN语法默认要求左边界值小于右边界值,而TIME类型是按当日24小时的数值排序的,22:00:00的排序优先级远高于06:00:00,因此不存在任何时间能满足大于等于22点且小于等于6点的条件,自然返回false。

针对22点到次日6点场景的正确写法

直接拆分两个判断条件用OR连接即可:

-- 该语句会正确返回true
SELECT '04:00:00'::TIME >= '22:00:00'::TIME OR '04:00:00'::TIME <= '06:00:00'::TIME;

通用兼容写法

如果需要同时兼容跨午夜和不跨午夜的两种区间判断,可以封装为通用函数,示例(PostgreSQL语法):

CREATE OR REPLACE FUNCTION time_between_cross_day(check_t TIME, start_t TIME, end_t TIME)
RETURNS BOOLEAN AS $$
SELECT CASE
    WHEN start_t < end_t THEN check_t BETWEEN start_t AND end_t
    ELSE check_t >= start_t OR check_t <= end_t
END;
$$ LANGUAGE sql IMMUTABLE;

调用示例:

-- 验证4点是否属于22点到6点区间,返回t
SELECT time_between_cross_day('04:00:00', '22:00:00', '06:00:00');
-- 验证13点是否属于10点到18点区间,返回t
SELECT time_between_cross_day('13:00:00', '10:00:00', '18:00:00');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:45:03