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ę.
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ę.
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.
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. –
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
trunc(tran_date) = trunc(sysdate -1)
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
, wtedy metoda rexem będzie pomocna. –
W takim przypadku można dodać indeks oparty na funkcji: utwórz indeks nazwa_indeksu na nazwa_tabeli (trunc (tran_date)); –
to_char(tran_date, 'yyyy-mm-dd') = to_char(sysdate-1, 'yyyy-mm-dd')
Oracle obsługuje szeroką gamę operatorów bezpośrednio w terminach, bez konieczności uciekania się do porównywania ciągów. –
Jeśli nie obsługują przyszłych datowane transakcje wtedy coś takiego może działać:
AND oh.tran_date >= trunc(sysdate-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)
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
ja wciąż się rekordy z ubiegłego roku po wypróbowaniu wszystkich sugestii. –
Jaki jest typ danych 'tran_date'? –
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