针对timestamp列的Oracle SQL where子句

时间:2013-02-16 17:58:43

标签: java sql oracle

我正在执行以下SQL查询,但即使表中存在与所选日期对应的条目,查询也不会返回任何行。

    Date getdatetemp =  datechooser.getDate();     // getting the date selected by user
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    java.sql.Date extdate=new java.sql.Date(getdatetemp.getTime());
    String getdate=sdf.format(extdate);
    String sql="SELECT * from registration_timestamp where timestamp_registered=TO_DATE('"+getdate+"','dd/MM/yyyy')";
    PreparedStatement pst=connection.prepareStatement(sql);
    ResultSet res=pst.executeQuery();  
    pst.close();
    res.close();

2 个答案:

答案 0 :(得分:2)

Learn about prepared statements,并使用原生类型而不是字符串:

java.sql.Date extDate = new java.sql.Date(getDateTemp.getTime());
String sql = "SELECT * from registration_timestamp where timestamp_registered=?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setDate(1, extDate);
ResultSet rs = stmt.executeQuery();

那就是说,既然你在谈论时间戳,并且时间戳的精度达到纳秒,问题可能是数据库中存储的日期除日期部分外还有一个时间部分:

16/02/2013 != 16/02/2013 18:54:32 123421

如果是这种情况(似乎是这样),请将所选日期与截断日期的时间戳进行比较:

select * from registration_timestamp where trunc(timestamp_registered) = ?

请参阅http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions201.htm#i79761

答案 1 :(得分:0)

当您的列是日期时间并且您想要搜索日期范围时,请执行以下操作:

select whatever
from yourtables
where yourdatefield >= DateA
and yourdatefield < the day after DateB

将这个逻辑与@JBNizet和Bob的叔叔的答案结合起来。