2

単純な SQL クエリを最適化しようとしていますが、何か提案があるかどうか疑問に思っていました。私は、Oracle 11g データベースで Oracle SQL Developer (私は好きではありません) を使用して開発しています。私が使用しているクエリは次のとおりです。

SELECT count(*) 
FROM my_table 
WHERE my_date
BETWEEN TO_DATE('2012-5-09T05.00.00','YYYY-MM-DD"T"HH24:MI:SS') 
AND TO_DATE('2012-5-10T04.59.59','YYYY-MM-DD"T"HH24:MI:SS') 
AND my_code='33' 
GROUP BY my_code;

また、日付の一部を現在の日付に変更することで、このクエリを動的に使用できるようにしたいのですが、時間を指定できるようにしたいと考えています。だから私は次のようなものを比較したい:

getdate() + 'T05.00.00'

これを行う方法がわかりません。getdate() 関数が SQL Developer で機能しないようです/正しく使用する方法がわかりません。

だから私が探しているのは、最適化の提案と、結果を制限したい日付の日月年の部分を動的に変更する方法に関する指針です。ありがとう!

4

3 に答える 3

5

現在の日付を取得するには、SYSDATE を使用できます。それに x 時間数を追加するには、x/24 を追加できます。だから、このようなもの:

例: 現在の日付 + 5 時間を取得

 SELECT SYSDATE + 5/24 FROM dual

あなたの例では:

SELECT count(*) 
FROM my_table 
WHERE my_date
BETWEEN sysdate
AND sysdate + 5/24 -- if you want 5 hours ahead, for example
AND my_code='33' 
GROUP BY my_code;

時間数を変更できるようにしたい場合は、このコードを関数にして、時間とコードを変数として渡すことができます。

このようなもの:

CREATE FUNCTION myfunc
(
   p_num_hours INT
 , p_my_code VARCHAR
) RETURN INT
AS
  l_ret INT;
BEGIN
   SELECT count(*) 
   INTO l_ret
   FROM my_table 
   WHERE my_date
   BETWEEN sysdate
   AND sysdate + p_num_hours/24
   AND my_code=p_my_code 

   RETURN l_ret;
END;
于 2012-06-01T14:44:49.477 に答える
2

「5 / 24」などの式を使用して小数日を追加する代わりに、INTERVAL 定数を使用することもできます。例えば:

SELECT count(*)
  FROM my_table
  WHERE my_date BETWEEN (TRUNC(SYSDATE) + INTERVAL '5' HOUR)
                    AND (TRUNC(SYSDATE) + INTERVAL '1' DAY +
                          INTERVAL '5' HOUR - INTERVAL '1' SECOND) AND
        my_code='33'
  GROUP BY my_code

これらの定数が何を表しているかが非常に明確であるため、区間定数を使用するのが好きです。小数日定数を使用すると、時々混乱します (「もちろん、関係なく、混乱することもあります... :-)」

共有してお楽しみください。

于 2012-06-01T18:43:17.557 に答える
0

私が正しく理解していれば、

      select count(*) 
    from my_table 
   where trunc(my_date) = trunc(sysdate)
     and my_code = '33' 
group by my_code;

また

      select count(*) 
    from my_table 
   where my_date
 between sysdate and sysdate + 5/24
     and my_code = '33' 
group by my_code;

HTH。

アレッサンドロ

于 2012-06-01T14:45:40.553 に答える