2017-09-12 1 views
2

J'ai une requête ci-dessous où le DT_ID est la colonne de type de données de nombre et la valeur stockée dans cette colonne est la date dans le format 'YYYYMMDD'.La conversion du nombre à ce jour affecte les performances dans Oracle

Dans ma requête ci-dessous, je veux obtenir les données de la semaine précédente du lundi au dimanche pour les rapports hebdomadaires et cette requête fonctionne très rapidement.

select ID,NAME 
from TEST_REPORT 
where 
DT_ID between 20170904 and 20170910; 

Mais c'est une date codée en dur et je veux la rendre dynamique. J'ai essayé avec cette requête:

select ID,NAME 
from TEST_REPORT 
where 
DT_ID>= next_day(trunc(sysdate), 'MONDAY') - 14 and 
      DT_ID< next_day(trunc(sysdate), 'MONDAY') - 7; 

Mais il donne cette erreur:

expecting Number and got date

Quand je convertir ce nombre à ce jour comme ci-dessous, il est question résultant beaucoup de problèmes de performance. Y a-t-il un autre moyen de le rendre dynamique avec de meilleures performances?

select ID,NAME 
from TEST_REPORT 
where 
to_date(DT_ID,'YYYYMMDD') >= next_day(trunc(sysdate), 'MONDAY') - 14 and 
      (DT_ID,'YYYYMMDD') < next_day(trunc(sysdate), 'MONDAY') - 7; 
+0

S'il vous plaît montrer la définition de table, et les types de données de colonne, et les données de table exemple. merci – OldProgrammer

Répondre

3

Vous pouvez convertir les valeurs de date à cordes, puis aux numéros:

select ID,NAME 
from TEST_REPORT 
where DT_ID >= to_number (to_char (next_day(trunc(sysdate), 'MONDAY') - 14, 
          'YYYYMMDD')) 
    and DT_ID < to_number (to_char (next_day(trunc(sysdate), 'MONDAY') - 7, 
          'YYYYMMDD')); 
+0

oui cela fonctionne avec de bonnes performances – Andrew