sql >> Database >  >> RDS >> Mysql

Algemene datumnotatiefunctie voor Oracle-sql en Mysql

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) .



  1. Modelleren van een open markt voor onderwijs

  2. PDO PHP invoegen in DB vanuit een associatieve array

  3. SQLite CHECK-beperkingen

  4. Selecteer een bericht dat geen bepaalde tag heeft