Oracle SQL根据date_time列值动态调整WHERE条件求助
解决方案
首先简化你提到的条件逻辑,并用更高效的Oracle函数实现:
- 判断
date_time是否为当天00:00:00,直接用TRUNC(date_time) = date_time即可(TRUNC函数会自动截断时间部分至0点,两者相等则原时间就是0点) - 目标时间的日期部分也可以用
TRUNC直接提取,替代你原来嵌套的TO_DATE(TO_CHAR(...))写法
直接用逻辑表达式实现(推荐,更简洁高效)
SELECT a ,b ,c ,date_time FROM t WHERE condition_1 OR ( -- 当date_time是00:00:00时,日期部分 >= 目标日期 (TRUNC(date_time) = date_time AND TRUNC(date_time) >= TRUNC(TO_DATE('2022-01-01 11:11:59', 'yyyy-mm-dd hh24:mi:ss'))) -- 否则,date_time > 目标时间 OR (TRUNC(date_time) != date_time AND date_time > TO_DATE('2022-01-01 11:11:59', 'yyyy-mm-dd hh24:mi:ss')) )
用CASE WHEN实现的写法
如果一定要用CASE WHEN结构,可在WHERE子句中通过返回数值等价布尔判断:
SELECT a ,b ,c ,date_time FROM t WHERE condition_1 OR CASE WHEN TRUNC(date_time) = date_time THEN CASE WHEN TRUNC(date_time) >= TRUNC(TO_DATE('2022-01-01 11:11:59', 'yyyy-mm-dd hh24:mi:ss')) THEN 1 ELSE 0 END ELSE CASE WHEN date_time > TO_DATE('2022-01-01 11:11:59', 'yyyy-mm-dd hh24:mi:ss') THEN 1 ELSE 0 END END = 1
性能优化建议
如果查询数据量较大,建议提前定义目标变量避免重复转换:
DECLARE target_dt DATE := TO_DATE('2022-01-01 11:11:59', 'yyyy-mm-dd hh24:mi:ss'); target_trunc_dt DATE := TRUNC(target_dt); BEGIN SELECT a ,b ,c ,date_time FROM t WHERE condition_1 OR ( (TRUNC(date_time) = date_time AND TRUNC(date_time) >= target_trunc_dt) OR (TRUNC(date_time) != date_time AND date_time > target_dt) ); END;
内容的提问来源于stack exchange,提问作者Mado.h
相关产品推荐
相关产品推荐

