Oracle类型DATE

时间:2013-07-31 20:10:11

标签: java oracle

我在数据库表中有字段类型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小时。

3 个答案:

答案 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_CHARTRUNC应用了一个函数。

另外,我建议使用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());

感谢大家的帮助。