Innanzitutto, in MySQL le date di solito hanno il seguente formato quando vengono convertite in modo implicito:2015-01-16
- anziché 20150116
. Penso che tu possa fare quanto segue sia in MySQL che Oracle (è SQL standard) - L'ho verificato in Oracle (10g) e funziona, e sembra funzionare nel mio giocherellare con MySQL
:
SELECT * FROM mytable
WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );
La stringa letterale da convertire in DATE deve essere nella forma yyyy-mm-dd
. Ora funzionerà se le tue date sono date e non ho una porzione di tempo. Ora, se le tue date hanno una parte temporale, le cose diventano più difficili poiché MySQL usa DATE()
funzione per ottenere la parte della data, mentre Oracle userebbe TRUNC()
. Ma puoi aggirare il problema con un uso giudizioso di >=
e <
, ad esempio:
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' );
Ora se vuoi usare SYSDATE
, la cosa migliore da fare sarebbe usare lo standard ANSI CURRENT_DATE
o CURRENT_TIMESTAMP
. Questi possono essere confrontati direttamente senza bisogno di formattazione e dovrebbero funzionare sia in MySQL che in Oracle. Puoi anche fare aritmetica sulla data usando INTERVAL
, nel qual caso potresti provare quanto segue:
SELECT * FROM mytable
WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;
AGGIORNAMENTO Ci ho pensato un po'. La query immediatamente sopra non funziona davvero se vuoi ottenere tutte le righe che sono state immesse oggi . La difficoltà è che Oracle riconosce i valori letterali di data ANSI come date (cioè senza porzione di tempo), ma non esiste, per quanto ne so, un modo ANSI standard per convertire una data/ora valore (che un Oracle DATE
è) a una data . Detto questo, sia Oracle che MySQL supportano la funzione EXTRACT(), quindi dovresti essere in grado di fare quanto segue per ottenere oggi record di:
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);
Decisamente ingombrante, soprattutto se uno ha più di una data da considerare (cosa che presumo tu faccia dato che stai usando il IN
operatore), ma dovrebbe funzionare su entrambe le piattaforme. Guarda la demo di SQL Fiddle qui (MySQL)
e qui (Oracle)
.