如何编写符合IBM应用限制的跨日夜时段SQL查询语句
解决跨日夜时段的SQL查询方案
针对你遇到的这个跨午夜时段判断问题,同时满足IBM应用的严格SQL格式限制,我们可以通过区分时段是否跨天来构造WHERE条件,完美覆盖所有情况:
核心逻辑
我们需要分两种场景处理:
- 非跨天时段(
SCHEDULESTART <= SCHEDULEEND,比如09:00-17:00):直接判断时间落在起始和结束区间内 - 跨天时段(
SCHEDULESTART > SCHEDULEEND,比如22:00-03:00):时间要么大于等于起始时间,要么小于等于结束时间
符合要求的SQL语句
SELECT * FROM T1 WHERE ( -- 非跨天时段:时间在区间内 (SELECT SCHEDULESTART FROM T2) <= (SELECT SCHEDULEEND FROM T2) AND TIME(SCHEDULE) BETWEEN (SELECT SCHEDULESTART FROM T2) AND (SELECT SCHEDULEEND FROM T2) ) OR ( -- 跨天时段:时间大于等于起始 或者 小于等于结束 (SELECT SCHEDULESTART FROM T2) > (SELECT SCHEDULEEND FROM T2) AND (TIME(SCHEDULE) >= (SELECT SCHEDULESTART FROM T2) OR TIME(SCHEDULE) <= (SELECT SCHEDULEEND FROM T2)) )
说明
- 这个语句严格遵循了
SELECT * FROM T1 WHERE...的开头要求,没有使用任何JOIN/UNION ALL等受限语法 - 通过子查询获取T2的时段参数,自动适配两种时段类型
- 不管T2里是普通日间时段还是跨午夜时段,都能准确筛选出T1中符合条件的行
举个测试例子:
- 如果T2的时段是
22:00到03:00,T1中2018-05-12 23:00:00和2018-05-13 02:00:00都会被选中,而2018-05-12 10:00:00会被排除 - 如果T2的时段是
09:00到17:00,则只有2018-05-12 14:00:00这类落在区间内的行被选中
内容的提问来源于stack exchange,提问作者Veljko
相关产品推荐
相关产品推荐

