我在数据库表中有字段类型DATE
我需要按日期范围选择信息:
select to_char(log_hour, ' DD/MM/YY HH24') from log_hourly_page page_counts where to_char(log_hour, 'DD/MM/YY') = '25/06/13' order by log_hour desc;
我得到了正确的结果(每小时记录很多)
25/06/13 23
25/06/13 23
25/06/13 23
25/06/13 22
...........
25/06/13 04
25/06/13 04
25/06/13 00
25/06/13 00
但是当我跑步时
select to_char(log_hour, ' DD/MM/YY HH24') from log_hourly_page page_counts where log_hour = '25-Jun-2013' order by log_hour desc;
我的小时总是0,
25/06/13 00
25/06/13 00
25/06/13 00
25/06/13 00
.............
25/06/13 00
25/06/13 00
25/06/13 00
为什么第二个查询以这种方式工作?我测试这个查询,因为我将Java.util.Date对象作为日期传递,它返回错误的数据,总是00小时。
答案 0 :(得分:3)
在Oracle中以这种方式指定的日期有一个时间组件:
'25-Jun-2013'
且时间组件为0(午夜),小时为0,因此您只能从该特定时间点获得匹配,而不是从一整天开始。
要获得整天的范围,请使用您已有的范围:
where to_char(log_hour, 'DD/MM/YY') = '25/06/13'
或使用范围:
where log_hour >= '25/06/13' and log_hour < '26/06/13'
修改强>
现在我看到你的实际Java代码:
query.setDate("date", date);
传递没有时间组件的SQL DATE。
您希望使用setTimestamp
,它将SQL TIMESTAMP传递给数据库,该数据库具有时间组件和日期组件。
query.setTimestamp("date", timestamp);
答案 1 :(得分:1)
如果您在log_hour
上有索引,Oracle将优化查询,除非您对TO_CHAR
或TRUNC
应用了一个函数。
另外,我建议使用ANSI日期语法,因为它始终有效。您的where log_hour = '25-Jun-2013'
取决于Oracle的日期格式设置,在大多数安装中都是DD-MON-RR
,但可以更改。如果您尝试'25-Jun-2013'
且Oracle使用的是其他格式,则查询将失败。
select to_char(log_hour, ' DD/MM/YY HH24')
from log_hourly_page page_counts
where log_hour >= DATE '2013-06-25' AND log_hour < DATE '2013-06-26'
order by log_hour desc;
答案 2 :(得分:0)
我的解决方案是
private DateTimeFormatter processHourFormat = new DateTimeFormatterBuilder().appendMonthOfYear(2)
.appendLiteral('/')
.appendDayOfMonth(2)
.appendLiteral('/')
.appendYear(4, 4)
.toFormatter();
private SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
DateTime dateTimeFrom = DateTime.parse(dateFormat.format(proxyParams.getFromDate()), processHourFormat).withHourOfDay(00);
DateTime dateTimeTo = DateTime.parse(dateFormat.format(proxyParams.getToDate()), processHourFormat).withHourOfDay(23);
query.setTimestamp("fromDate", dateTimeFrom.toDate());
query.setTimestamp("toDate", dateTimeTo.toDate());
感谢大家的帮助。