Po pierwsze, w MySQL daty mają zwykle następujący format, gdy są konwertowane niejawnie - 2015-01-16
- zamiast 20150116
. Myślę, że możesz wykonać następujące czynności zarówno w MySQL i Oracle (jest to standardowy SQL) - sprawdziłem to w Oracle (10g) i działa i wydaje się działać w mojej pracy z MySQL
:
SELECT * FROM mytable
WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );
Literał ciągu, który ma zostać przekonwertowany na DATE, musi mieć postać yyyy-mm-dd
. Teraz to zadziała, jeśli Twoje daty to daty i nie ma części czasu. Teraz, jeśli twoje daty mają część czasu, sprawy stają się trudniejsze, ponieważ MySQL używa DATE()
funkcja, aby pobrać część daty, podczas gdy Oracle użyłoby TRUNC()
. Ale możesz to obejść, rozsądnie używając >=
i <
, np.:
SELECT * FROM mytable
WHERE ( mydate >= DATE '2015-01-16' AND mydate < DATE '2015-01-17' )
OR ( mydate >= DATE '2015-01-18' AND mydate < DATE '2015-01-19' );
Teraz, jeśli chcesz użyć SYSDATE
, najlepiej byłoby użyć standardu ANSI CURRENT_DATE
lub CURRENT_TIMESTAMP
. Można je porównać bezpośrednio bez potrzeby formatowania i powinny działać zarówno w MySQL, jak i Oracle. Możesz także wykonać arytmetykę dat za pomocą INTERVAL
, w takim przypadku możesz spróbować następujących czynności:
SELECT * FROM mytable
WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;
AKTUALIZUJ Myślałem o tym trochę. Zapytanie bezpośrednio powyżej nie działa, jeśli chcesz pobrać wszystkie wiersze, które zostały wprowadzone dzisiaj . Trudność polega na tym, że Oracle rozpoznaje literały daty ANSI jako daty (tzn. bez części czasowej), ale z tego, co wiem, nie ma standardowego sposobu konwersji daty/godziny wartość (która Oracle DATE
jest) do daty . To powiedziawszy, zarówno Oracle, jak i MySQL obsługują funkcję EXTRACT(), więc powinieneś być w stanie wykonać następujące czynności, aby uzyskać dzisiaj rekordy:
SELECT * FROM mytable
WHERE EXTRACT(YEAR FROM mydate) = EXTRACT(YEAR FROM CURRENT_DATE)
AND EXTRACT(MONTH FROM mydate) = EXTRACT(MONTH FROM CURRENT_DATE)
AND EXTRACT(DAY FROM mydate) = EXTRACT(DAY FROM CURRENT_DATE);
Zdecydowanie nieporęczny, zwłaszcza jeśli ktoś ma do rozważenia więcej niż jedną datę (co zakładam, że robisz, ponieważ używasz IN
operatora), ale powinien działać na obu platformach. Zobacz demonstrację SQL Fiddle tutaj (MySQL)
i tutaj (Oracle)
.