Zaprvé, data v MySQL mají při implicitním převodu obvykle následující formát - 2015-01-16
- spíše než 20150116
. Myslím, že v MySQL a můžete udělat následující Oracle (je to standardní SQL) – zkontroloval jsem to v Oracle (10g) a funguje to a zdá se, že to funguje v mém hraní s MySQL
:
SELECT * FROM mytable
WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );
Řetězcový literál, který se má převést na DATE, musí mít tvar yyyy-mm-dd
. Nyní to bude fungovat, pokud jsou vaše data data a nemají časovou část. Nyní, pokud vaše data mají časovou část, věci se stanou obtížnějšími, protože MySQL používá DATE()
k získání části data, zatímco Oracle by použil TRUNC()
. Ale můžete to obejít rozumným používáním >=
a <
, např.:
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' );
Nyní, pokud chcete použít SYSDATE
, nejlepší by bylo použít standard ANSI CURRENT_DATE
nebo CURRENT_TIMESTAMP
. Ty lze přímo porovnávat bez nutnosti formátování a měly by fungovat v MySQL i Oracle. Můžete také provést aritmetiku data pomocí INTERVAL
, v takovém případě můžete zkusit následující:
SELECT * FROM mytable
WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;
AKTUALIZACE Nějak jsem o tom přemýšlel. Dotaz bezprostředně výše ve skutečnosti nefunguje, pokud chcete získat všechny zadané řádky dnes . Potíž je v tom, že Oracle rozpoznává datové literály ANSI jako data (tj. bez časové části), ale pokud vím, neexistuje standardní způsob převodu data/času hodnota (což je Oracle DATE
je) k datu . To znamená, že Oracle i MySQL podporují funkci EXTRACT(), takže byste měli být schopni udělat následující, abyste získali dnes záznamy uživatele:
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);
Rozhodně nepraktické, zvláště pokud je třeba zvážit více než jedno datum (což předpokládám, že ano, protože používáte IN
operátor), ale měl by fungovat na obou platformách. Podívejte se na ukázku SQL Fiddle zde (MySQL)
a zde (Oracle)
.