2 votes

Optimisation des requêtes SQL et utilisation dynamique de la date courante

J'essaie d'optimiser une simple requête SQL et je me demandais si quelqu'un avait des suggestions à faire. Je développe à l'aide d'Oracle SQL Developer (que je n'aime pas) sur une base de données Oracle 11g. La requête que j'utilise est la suivante :

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;

De plus, je veux pouvoir utiliser cette requête de manière dynamique en changeant la partie de la date pour qu'elle corresponde à la date actuelle, mais je veux pouvoir spécifier l'heure. Je veux donc pouvoir comparer quelque chose comme :

getdate() + 'T05.00.00'

Je n'ai aucune idée de la manière de procéder et la fonction getdate() ne semble pas fonctionner dans SQL Developer/je ne sais pas comment l'utiliser correctement.

Je suis donc à la recherche de suggestions d'optimisation et d'indications sur la manière de modifier dynamiquement la partie jour-mois-année de la date à laquelle je veux limiter mes résultats. Merci d'avance.

5voto

dcp Points 26928

Pour obtenir la date actuelle, vous pouvez utiliser SYSDATE. Pour ajouter x nombre d'heures à la date, vous pouvez ajouter x/24. Donc quelque chose comme ceci :

Exemple : Obtenir la date actuelle + 5 heures

 SELECT SYSDATE + 5/24 FROM dual

Donc, dans votre exemple :

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;

Si vous souhaitez pouvoir modifier le nombre d'heures, vous pouvez transformer ce code en une fonction et transmettre les heures et le code en tant que variables.

Quelque chose comme ça :

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;

2voto

Bob Jarvis Points 14906

Comme alternative à l'ajout de jours fractionnaires via des expressions telles que "5 / 24", vous pouvez utiliser une constante INTERVAL. Par exemple :

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

J'aime utiliser les constantes INTERVAL parce que ce qu'elles représentent est assez clair. Avec les constantes de jours fractionnés, je suis parfois confus ( bien sûr, je suis parfois confus, de toute façon... :-)

Partagez et appréciez.

0voto

archimede Points 511

Si je comprends bien, quelque chose comme

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

ou

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

HTH.

Alessandro

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X