12

次のクエリを使用して、過去 30 日間のカウントを取得しようとしています -

SELECT date_occured, COUNT(*) FROM problem
WHERE date_occured >= (CURRENT_DATE - 30)
GROUP BY date_occured;

//date_occured field is of type DATE.

基本的に、私のクエリでは、条件の日付部分のみを比較しようとしていますdate_occured >= (CURRENT_DATE - 30)が、時間も比較しているようです。

次のようにTRUNCを試しました-

TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30)

しかし、クエリを実行しても返されません。

私も試しました-

SELECT date_occured, COUNT(*) FROM problem    
GROUP BY date_occured
HAVING TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30);

繰り返しますが、それは決して戻りません。

Oracle の 2 つの DATE 値から日付部分のみを比較するにはどうすればよいですか?

4

5 に答える 5

15

この条件では、右側のみを TRUNC する必要があります。

WHERE date_occured >= TRUNC(CURRENT_DATE - 30)

なんで?TRUNC(date_occured) が TRUNC(CURRENT_DATE - 30) より後の場合、TRUNC(date_occured) の後の任意の時点も TRUNC(CURRENT_DATE - 30) より後にバインドされるためです。

date_occured >= TRUNC(date_occured) であることが常に真であることは明らかです (考えてみてください)。

ロジックによると、A >= B かつ B >= C の場合、A >= C となります。

代わりに:

  • A : date_occured
  • B : TRUNC(date_occured)
  • C : TRUNC(CURRENT_DATE - 30)
于 2011-09-15T15:28:35.397 に答える
3

選択部分でも切り捨てたいと思うでしょう:

 SELECT TRUNC(date_occured) AS short_date_occured, COUNT(*)
 FROM problem 
 WHERE date_occured >= trunc(SYSDATE- 30) 
 GROUP BY short_date_occured;
于 2011-09-15T15:33:01.520 に答える
1

私はトニーが正しいと思う傾向があり、あなたは本当にTRUNC式の右側だけを望んでいます。

TRUNC式の両側が必要で、パフォーマンスの問題が発生している場合は、関数ベースのインデックスが必要になる可能性があります

CREATE INDEX idx_problem_trunc_dt_occured
    ON problem( trunc( date_occurred ) );

これにより、元のクエリで関数ベースのインデックスを使用できるようになります。

于 2011-09-15T15:45:55.787 に答える
1

SYSDATE と CURRENT_DATE を使用してみてください。Sysdate はサーバーのローカル時間を使用します。CURRENT_DATE は、クライアントの接続のローカル時間でサーバーの現在の日付/時間を返します。

于 2011-09-15T15:32:20.783 に答える