web-dev-qa-db-fra.com

Oracle: Comment puis-je sélectionner des enregistrements UNIQUEMENT à partir d'hier?

J'ai passé des heures à chercher sur le Web une réponse à cette question ...

Voici ce que j'ai actuellement:

select  *
from    order_header oh
where   tran_date = sysdate-1

Merci d'avance.

34
Keith Myers

Utilisation:

AND oh.tran_date BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE) - 1/86400

Référence: TRUNC

L'appel d'une fonction sur le tran_date signifie que l'optimiseur ne pourra pas utiliser d'index (en supposant qu'il en existe un) qui lui est associé. Certaines bases de données, telles qu'Oracle, prennent en charge les index basés sur les fonctions qui permettent d'exécuter des fonctions sur les données afin de minimiser l'impact dans de telles situations, mais les administrateurs de base de données IME ne le permettent pas. Et je suis d'accord - ils ne sont pas vraiment nécessaires dans ce cas.

64
OMG Ponies
trunc(tran_date) = trunc(sysdate -1)
14
Henry Gao

Ce commentaire est destiné aux lecteurs qui ont trouvé cette entrée mais qui utilisent mysql au lieu d'Oracle! Sur mysql, vous pouvez effectuer les opérations suivantes: Aujourd'hui

SELECT  * 
FROM 
WHERE date(tran_date) = CURRENT_DATE()

Hier

SELECT  * 
FROM yourtable 
WHERE date(tran_date) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)
1
netsuvi
to_char(tran_date, 'yyyy-mm-dd') = to_char(sysdate-1, 'yyyy-mm-dd')
1
Pablo Santa Cruz

Si vous ne prenez pas en charge les transactions datées ultérieurement, cela pourrait fonctionner:

AND oh.tran_date >= trunc(sysdate-1)
1
ninesided

Si vous voulez l’horodatage d’hier, essayez quelque chose comme:

(CURRENT_TIMESTAMP - INTERVAL '1' DAY)
0
Aliuk