Java 甲骨文日期

Java 甲骨文日期,java,oracle,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; 我得到了正确的结果(每小时有许多记录) 但是当我跑的时候 select to_char(log_hour, ' DD/MM/Y

我在数据库表中有字段类型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; 
我得到了正确的结果(每小时有许多记录)

但是当我跑的时候

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小时。

在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'
它传递一个没有时间组件的SQL日期

query.setTimestamp("date", timestamp);
您希望使用,它将SQL时间戳传递给数据库,该数据库具有时间组件和日期组件

query.setTimestamp("date", timestamp);

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'
它传递一个没有时间组件的SQL日期

query.setTimestamp("date", timestamp);
您希望使用,它将SQL时间戳传递给数据库,该数据库具有时间组件和日期组件

query.setTimestamp("date", timestamp);

如果您在
log\u hour
上有一个索引,Oracle将优化查询,除非您对其应用类似
的函数

另外,我建议使用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;
选择字符(记录时间,'DD/MM/YY HH24')
从日志\每小时\页面\页面\计数
其中log_hour>=日期“2013-06-25”和log_hour<日期“2013-06-26”
按日志小时描述订购;

如果您在
log\u hour
上有索引,Oracle将优化查询,除非您对其应用类似
的函数

另外,我建议使用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;
选择字符(记录时间,'DD/MM/YY HH24')
从日志\每小时\页面\页面\计数
其中log_hour>=日期“2013-06-25”和log_hour<日期“2013-06-26”
按日志小时描述订购;
我的解决方案是

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());
谢谢大家的帮助。

我的解决方案是

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());

谢谢大家的帮助。

在SELECT语句中检索
DATE
字段作为日期,然后在Java代码中使用
ResultSet#getTimestamp(1)
并将其与
java.util.Date
字段相关联。Luiggi Mendoza-我没有真正理解您的解决方案在SELECT语句中检索
Date
字段作为日期,然后在java代码中使用
ResultSet 35; getTimestamp(1)
并将其与
java.util.Date
字段相关联。Luiggi Mendoza-我不太理解您的解决方案,无法在java端对其进行调整,现在我只是将java.util.Date作为参数-query.setDate(“Date”,Date)传递;date有类型date,我总是得到00。似乎同样的问题如果使用范围我总是增加DatePickerHanks的传入数据,以便在这里提供实际的Java代码;我以前看到的只是你的SQL。是的,对不起,我以前没有提到过。我仍然有同样的问题,query.setTimestamp(“fromDate”,proxyParams.getFromDate())之后的结果中只有00;与query.setDate(“fromDate”,proxyParams.getFromDate())相同;。proxyParams.getFromDate()-日期类型,分配值作为post请求提供,2013年6月24日proxyParams.getFromDate()的时间值部分是什么?它仍将尝试匹配确切的日期和时间。无论如何,要在Java端对其进行调整,现在我只需将Java.util.date作为参数-query.setDate(“date”,date)传递;date有类型date,我总是得到00。似乎同样的问题如果使用范围我总是增加DatePickerHanks的传入数据,以便在这里提供实际的Java代码;我以前看到的只是你的SQL。是的,对不起,我以前没有提到过。我仍然有同样的问题,query.setTimestamp(“fromDate”,proxyParams.getFromDate())之后的结果中只有00;与query.setDate(“fromDate”,proxyParams.getFromDate())相同;。proxyParams.getFromDate()-日期类型,分配值作为post请求提供,2013年6月24日proxyParams.getFromDate()的时间值部分是什么?它仍将尝试匹配确切的日期和时间。