Първо, в MySQL датите обикновено имат следния формат, когато се преобразуват имплицитно - 2015-01-16
- вместо 20150116
. Мисля, че можете да направите следното както в MySQL и Oracle (той е стандартен SQL) - проверих го в Oracle (10g) и работи и изглежда работи в моята работа с MySQL
:
SELECT * FROM mytable
WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );
Низовият литерал, който трябва да бъде преобразуван в ДАТА, трябва да бъде във формата yyyy-mm-dd
. Сега това ще работи, ако вашите дати са дати и нямат част от времето. Сега, ако вашите дати имат времева част, тогава нещата стават по-трудни, тъй като MySQL използва DATE()
функция за получаване на частта от датата, докато Oracle ще използва TRUNC()
. Но можете да заобиколите това с разумно използване на >=
и <
, напр.:
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' );
Сега, ако искате да използвате SYSDATE
, най-доброто нещо, което можете да направите, е да използвате стандарта ANSI CURRENT_DATE
или CURRENT_TIMESTAMP
. Те могат да се сравняват директно без нужда от форматиране и трябва да работят както в MySQL, така и в Oracle. Можете също така да правите аритметика с дати, като използвате INTERVAL
, в който случай можете да опитате следното:
SELECT * FROM mytable
WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;
АКТУАЛИЗАЦИЯ Мислих малко за това. Заявката непосредствено по-горе всъщност не работи, ако искате да получите всички редове, които са въведени днес . Трудността е, че Oracle разпознава литералите за дата на ANSI като дати (т.е. без част от времето), но доколкото знам, няма стандартен ANSI начин за преобразуване на дата/час стойност (която е DATE
на Oracle е) до дата . Въпреки това Oracle и MySQL поддържат функцията EXTRACT(), така че трябва да можете да направите следното, за да получите днес записи на:
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);
Определено тромаво, особено ако има повече от една дата за разглеждане (което предполагам, че правите, тъй като използвате IN
оператор), но трябва да работи и на двете платформи. Вижте демонстрация на SQL Fiddle тук (MySQL)
и тук (Oracle)
.