如何在java中查询数据库中的日期间隔?

时间:2013-07-16 06:55:22

标签: java database date

我有一个表和一个日期列,其中我使用以下格式保留时间戳值:

yyyy-MM-dd HH:mm:ss

然后我想创建一个返回特定时间间隔的查询。我给出了开始日期和结束日期。我正在做的是:

PreparedStatement find = (PreparedStatement) con.prepareStatement("select * from transactions where transid=? and date >= ? and date <= ?");

    find.setString(1, selected.getIban());
    find.setDate(2, (Date) dt1);
    find.setDate(3, (Date) dt2);

    ResultSet res=find.executeQuery();

    while(res.next()){
        ....
    }

调试时我发现dt1和dt2设置正确,格式如下:

yyyy-MM-dd

此结果集中没有结果(不为null,但为空),而while循环不执行。我不能像我在查询中那样使用&gt; =和&lt; =这样做吗?或者是因为我将时间戳存储在数据库中但是使用日期查询,并且这些时间戳具有不同的格式。

谢谢

4 个答案:

答案 0 :(得分:0)

使用 preparedStatement.setTimestamp(); 代替setDate()

答案 1 :(得分:0)

使用setTimestamp

PreparedStatement find = (PreparedStatement) con.prepareStatement("select * from transactions where transid=? and date >= ? and date <= ?");

    find.setString(1, selected.getIban());
find.setTimestamp(2, new Timestamp(((Date) dt1).getTime()));
find.setTimestamp(3, new Timestamp(((Date) dt2).getTime()));

    ResultSet res=find.executeQuery();

    while(res.next()){
        ....
    }

或将日期转换为字符串并传递

    PreparedStatement find = (PreparedStatement) con.prepareStatement("select * from                transactions where transid=? and date >= ? and date <= ?");

        find.setString(1, selected.getIban());
   find.setString(2, (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) dt2)));
    find.setString(3, (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) dt2)));

        ResultSet res=find.executeQuery();

        while(res.next()){
            ....
        }

答案 2 :(得分:0)

我想出了怎么做。问题是因为Date和TIMESTAMP是不同类型的变量,比较它们会返回空。为了解决这个问题,我稍微改了一下查询:

PreparedStatement find = (PreparedStatement) con.prepareStatement("select * from transactions where transid=? and DATE(date) >= ? and DATE(date) <= ?");        
find.setString(1, selected.getIban());
find.setDate(2,  dt1);
find.setDate(3, dt2);

现在有效

答案 3 :(得分:0)

为什么不尝试使用静态时间戳,如

select * from transactions    
where data > '2013-07-16 00:00:00'
and data < '2013-07-20 00:00:00' 

并查看问题是在sql还是在程序中