首页 > 解决方案 > Oracle SQL 查询中的条件 where 子句不起作用

问题描述

我正在尝试在这种情况下在 Oracle DB 上进行选择,但它不起作用。

LocalDateTime endDate = null;

表 POST

ID NUMBER
DATE_END TIMESTAMP(6)
select p.id from post p where (:endDate is null or p.date_end < :endDate);

但是什么时候endDate为空我得到了错误

ORA-00932 inconsistent datatypes expected TIMESTAMP got NUMBER.

请帮忙

标签: sqloracle

解决方案


样品设置

create table test (
DATE_END TIMESTAMP);

insert into test values (timestamp  '2009-12-26 22:22:22.123456');
insert into test values (timestamp  '2009-12-26 22:22:22.123458');

此查询模拟您的异常

select * from test where DATE_END > 1;
ORA-00932: inconsistent datatypes: expected TIMESTAMP got NUMBER

所以你很可能set对绑定变量使用了一些不正确的方法。

无论如何都setTimestamp可以与 JDBC 驱动程序12.1.0.2.0一起使用18 XE

def stmt = con.prepareStatement("select DATE_END from test where ? is null or DATE_END > ?")
stmt.setTimestamp(1,null)
stmt.setTimestamp(2,null)

def rs = stmt.executeQuery()
while(rs.next())
 {
   println "ts= ${rs.getTimestamp(1)}"
 }

返回两行

ts= 2009-12-26 22:22:22.123456 
ts= 2009-12-26 22:22:22.123458

当你传递一个真正的时间戳时你得到一个有限的结果

def ts = java.sql.Timestamp.valueOf('2009-12-26 22:22:22.123457')

def stmt = con.prepareStatement("select DATE_END from test where ? is null or DATE_END > ?")
stmt.setTimestamp(1,ts)
stmt.setTimestamp(2,ts)
...

ts= 2009-12-26 22:22:22.123458

推荐阅读