2009-10-15 12 views
27

spędziłem godzin szukając w internecie odpowiedzi na to pytanie ...Oracle: Jak mogę wybrać rekordy TYLKO od wczoraj?

Oto co obecnie mam:

select * 
from order_header oh 
where tran_date = sysdate-1 

góry dziękuję.

+0

ja wciąż się rekordy z ubiegłego roku po wypróbowaniu wszystkich sugestii. –

+1

Jaki jest typ danych 'tran_date'? –

+0

Proszę zamieścić kilka przykładowych danych i dokładne zapytanie, które właśnie uruchomiłeś. Ponieważ nie ma absolutnie żadnego sposobu, aby poprawnie napisane zapytanie ograniczone do SYSDATE-1 powinno zwracać wiersze pasujące do SYSDATE-366. – APC

Odpowiedz

58

Zastosowanie:

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

odniesienia: TRUNC

Wywołanie funkcję w tran_date oznacza optymalizacji nie będzie w stanie użyć wskaźnika (zakładając, że taka istnieje) z tym. Niektóre bazy danych, takie jak Oracle, obsługują oparte na funkcjach indeksy, które umożliwiają wykonywanie funkcji na danych w celu zminimalizowania wpływu w takich sytuacjach, ale administratorzy IME DBA nie pozwalają na takie dane. Zgadzam się - w tym przypadku nie są one naprawdę konieczne.

+4

Jedno małe zastrzeżenie - być może trzeba odjąć 1 sekundę od górnej granicy. W przeciwnym razie, jeśli masz datę TRAN_DATE, która jest dzisiaj o północy, zostanie ona zwrócona w zapytaniu o wiersze wstawione wczoraj. Nie spodziewałbym się, że będzie to pożądane zachowanie. –

+1

Należy wziąć pod uwagę, że to rozwiązanie nie uwzględnia oszczędności czasu letniego. To rozwiązanie zakłada, że ​​każdy dzień trwa 24h, a dzienna "dzień" trwa 23 godziny lub 25 godzin. – sbrbot

10
trunc(tran_date) = trunc(sysdate -1) 
+3

Jeśli, jak przypuszczam, istnieje indeks na tran_date, na którym opiera się to zapytanie, wywołanie funkcji w indeksowanej kolumnie w ten sposób zdziesiątkuje wydajność zapytania. – ninesided

+0

, wtedy metoda rexem będzie pomocna. –

+1

W takim przypadku można dodać indeks oparty na funkcji: utwórz indeks nazwa_indeksu na nazwa_tabeli (trunc (tran_date)); –

1
to_char(tran_date, 'yyyy-mm-dd') = to_char(sysdate-1, 'yyyy-mm-dd') 
+1

Oracle obsługuje szeroką gamę operatorów bezpośrednio w terminach, bez konieczności uciekania się do porównywania ciągów. –

1

Jeśli nie obsługują przyszłych datowane transakcje wtedy coś takiego może działać:

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

Ten komentarz jest dla czytelników, którzy znaleźli ten wpis ale MySQL zamiast wyroczni! na MySQL można wykonać następujące czynności: Dziś

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

Wczoraj

SELECT * 
FROM yourtable 
WHERE date(tran_date) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) 
+0

Otrzymuję "brakujące wyrażenie ORA-00936" w dniu. Zobacz http://stackoverflow.com/questions/19143376/ora-00936-when-using-date-function-in-the-oracle-select-statement – NealWalters

Powiązane problemy