2013-07-31 3 views
0

У меня есть тип DATE поля в таблице базы данных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 час.

+0

Извлеките поле DATE в качестве даты в инструкции SELECT, а затем в вашем Java-коде используйте 'ResultSet # getTimestamp (1)' и сопоставьте это с 'java.util.Date'. –

+0

Luiggi Mendoza - Я не совсем понял ваше решение – antohoho

ответ

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' 

EDIT

Теперь я получаю, чтобы увидеть ваши фактические Код Java:

query.setDate("date", date); 

Это передает SQL DATE, у которой нет компонента времени.

Вы хотите использовать setTimestamp, который передает SQL TIMESTAMP в базу данных с компонентом времени, а также компонентом даты.

query.setTimestamp("date", timestamp); 
+1

в любом случае, чтобы настроить его на конец Java, прямо сейчас я просто передаю java.util.date в качестве параметра - query.setDate («дата», дата); дата имеет тип Date, и я всегда получаю 00. Похоже на ту же проблему – antohoho

+0

, если используется RANGE. Я всегда увеличиваю входящие данные с datePicker – antohoho

+0

Спасибо за предоставление Java-кода здесь; все, что я видел ранее, было вашим SQL. – rgettman

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

Спасибо всем за помощь.