我有一个表和一个日期列,其中我使用以下格式保留时间戳值:
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; =这样做吗?或者是因为我将时间戳存储在数据库中但是使用日期查询,并且这些时间戳具有不同的格式。
谢谢
答案 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还是在程序中