För det första, i MySQL har datum vanligtvis följande format när de konverteras implicit - 2015-01-16
- istället för 20150116
. Jag tror att du kan göra följande i både MySQL och Oracle (det är standard SQL) - Jag har kontrollerat det i Oracle (10g) och det fungerar, och det verkar fungera i mitt pyssel med MySQL
:
SELECT * FROM mytable
WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );
Strängen literal som ska konverteras till DATE måste ha formen yyyy-mm-dd
. Nu kommer detta att fungera om dina datum är datum och har inte en tidsdel. Om dina datum nu har en tidsdel, blir det svårare eftersom MySQL använder DATE()
funktion för att hämta datumdelen, medan Oracle skulle använda TRUNC()
. Men du kan komma runt det med en klok användning av >=
och <
, t.ex.:
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' );
Om du nu vill använda SYSDATE
, det bästa du kan göra är att använda ANSI-standarden CURRENT_DATE
eller CURRENT_TIMESTAMP
. Dessa kan jämföras direkt utan behov av formatering och bör fungera i både MySQL och Oracle. Du kan också göra datumräkning med INTERVAL
, i så fall kan du prova följande:
SELECT * FROM mytable
WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;
UPPDATERA Jag har funderat en del på det här. Frågan direkt ovan fungerar inte riktigt om du vill få alla rader som har angetts idag . Svårigheten är att Oracle känner igen ANSI-datum som datum (det vill säga utan tidsdel), men det finns inte, så vitt jag vet, ett ANSI-standard sätt att konvertera ett datum/tid värde (som är ett Oracle DATE
is) till ett datum . Som sagt, både Oracle och MySQL stöder EXTRACT()-funktionen, så du bör kunna göra följande för att få idag s register:
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);
Definitivt otymplig, speciellt om man har mer än ett datum att tänka på (vilket jag antar att du gör eftersom du använder IN
operatör), men bör fungera på båda plattformarna. Se SQL Fiddle Demo här (MySQL)
och här (Oracle)
.