sql >> Database teknologi >  >> RDS >> Mysql

Fælles datoformatfunktion for Oracle-sql og Mysql

For det første har datoer i MySQL normalt følgende format, når de konverteres implicit - 2015-01-16 - i stedet for 20150116 . Jeg tror, ​​du kan gøre følgende i både MySQL og Oracle (det er standard SQL) - Jeg har tjekket det i Oracle (10g), og det virker, og det ser ud til at virke i mit fifl med MySQL :

SELECT * FROM mytable
 WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );

Den bogstavelige streng, der skal konverteres til DATE, skal have formen yyyy-mm-dd . Nu vil dette virke, hvis dine datoer er datoer og har ikke en tid portion. Hvis dine datoer nu har en tidsdel, bliver tingene sværere, da MySQL bruger DATE() funktion for at få datodelen, mens Oracle ville bruge TRUNC() . Men du kan komme uden om det med fornuftig brug af >= og < , f.eks.:

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' );

Hvis du nu vil bruge SYSDATE , ville den bedste ting at gøre være at bruge ANSI-standarden CURRENT_DATE eller CURRENT_TIMESTAMP . Disse kan sammenlignes direkte uden behov for formatering og bør fungere i både MySQL og Oracle. Du kan også lave datoregning ved at bruge INTERVAL , i så fald kan du prøve følgende:

SELECT * FROM mytable
 WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;

OPDATERING Jeg har tænkt lidt over det her. Forespørgslen umiddelbart ovenfor virker ikke rigtig, hvis du vil have alle de rækker, der er indtastet i dag . Vanskeligheden er, at Oracle genkender ANSI-dato-literals som datoer (det vil sige uden tidsdel), men der er, så vidt jeg ved, ikke en ANSI-standard måde at konvertere en dato/tid værdi (som er en Oracle DATE er) til en dato . Når det er sagt, understøtter både Oracle og MySQL EXTRACT()-funktionen, så du burde være i stand til at gøre følgende for at få i dag 's optegnelser:

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

Absolut besværligt, især hvis man har mere end én dato at overveje (hvilket jeg antager, at du gør, da du bruger IN operatør), men bør fungere på begge platforme. Se SQL Fiddle Demo her (MySQL) og her (Oracle) .



  1. Hvorfor Oracle ikke viser heltalsdelen af ​​en decimal

  2. Hvordan udfører jeg automatisk et MySQL script eller rutine efter videreudvikling fra model

  3. Generer en tilfældig streng i MySQL

  4. Fejlretning af MySQL-triggere