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; 

そして、私は正しい結果を得ています(1時間ごとに多くのレコード)

 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

2 番目のクエリがこのように機能するのはなぜですか? Java.util.Date オブジェクトを日付として渡すと、常に 00 時という間違ったデータが返されるため、このクエリをテストしています。

4

3 に答える 3

3

Oracle では、このように指定された日付に時間コンポーネントがあります。

'25-Jun-2013'

時間コンポーネントは 0 (真夜中) で、時間は 0 であるため、1 日全体ではなく、その特定の時点からの一致のみが取得されます。

1 日の範囲全体を取得するには、既にあるものを使用します。

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 を渡します。

SQL TIMESTAMP をデータベースに渡すを使用setTimestampします。これには、時間コンポーネントと日付コンポーネントがあります。

query.setTimestamp("date", timestamp);
于 2013-07-31T20:12:08.007 に答える
1

にインデックスがある場合、Oracle は、同様の関数またはそれに対して関数を適用しない限りlog_hour、クエリを最適化します。TO_CHARTRUNC

また、常に機能する ANSI 日付構文を使用することをお勧めします。ほとんどのインストールwhere log_hour = '25-Jun-2013'にある Oracle の日付形式設定に依存しますDD-MON-RRが、変更することができます。Oracle が別の形式を使用している場合'25-Jun-2013'、クエリは失敗します。

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 に答える