0

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

4

3 回答 3

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);
于 2013-07-31T20:12:08.007 回答
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;
于 2013-07-31T20:20:47.617 回答
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());

谢谢大家的帮助。

于 2013-07-31T23:17:10.507 回答