Ten eerste hebben datums in MySQL meestal het volgende formaat wanneer ze impliciet worden geconverteerd - 2015-01-16
- in plaats van 20150116
. Ik denk dat je het volgende kunt doen in zowel MySQL en Oracle (het is standaard SQL) - Ik heb het gecontroleerd in Oracle (10g) en het werkt, en het lijkt te werken in mijn gehannes met MySQL
:
SELECT * FROM mytable
WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );
De letterlijke tekenreeks die moet worden geconverteerd naar DATE moet de vorm yyyy-mm-dd
hebben . Dit werkt nu als je datums datums zijn en hebben geen tijdsdeel. Als uw datums nu een tijdsgedeelte hebben, wordt het moeilijker omdat MySQL de DATE()
gebruikt functie om het datumgedeelte te krijgen, terwijl Oracle TRUNC()
. zou gebruiken . Maar je kunt dat omzeilen met verstandig gebruik van >=
en <
, bijv.:
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' );
Als u nu SYSDATE
. wilt gebruiken , kunt u het beste de ANSI-standaard CURRENT_DATE
gebruiken of CURRENT_TIMESTAMP
. Deze kunnen direct worden vergeleken zonder dat ze hoeven te worden geformatteerd en zouden in zowel MySQL als Oracle moeten werken. U kunt ook datumberekeningen uitvoeren met INTERVAL
, in dat geval kunt u het volgende proberen:
SELECT * FROM mytable
WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;
UPDATE Ik heb hier wat over nagedacht. De query direct hierboven werkt niet echt als je alle rijen wilt krijgen die vandaag zijn ingevoerd . De moeilijkheid is dat Oracle ANSI-datumletters herkent als datums (dat wil zeggen, zonder tijdgedeelte), maar er is, voor zover ik weet, geen ANSI-standaard manier om een datum/tijd waarde (die een Oracle DATE
is) naar een datum . Dat gezegd hebbende, zowel Oracle als MySQL ondersteunen de EXTRACT()-functie, dus u zou het volgende moeten kunnen doen om vandaag te krijgen 's gegevens:
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);
Absoluut onpraktisch, vooral als je meer dan één datum moet overwegen (wat ik aanneem, aangezien je de IN
gebruikt operator), maar zou op beide platforms moeten werken. Bekijk hier de SQL Fiddle-demo (MySQL)
en hier (Oracle)
.