Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gemeinsame Datumsformatfunktion für Oracle-sql und Mysql

Erstens haben Daten in MySQL normalerweise das folgende Format, wenn sie implizit konvertiert werden - 2015-01-16 - statt 20150116 . Ich denke, Sie können Folgendes sowohl in MySQL als auch tun Oracle (es ist Standard-SQL) - Ich habe es in Oracle (10g) überprüft und es funktioniert, und es scheint zu funktionieren in meinem Gefummel mit MySQL :

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

Das in DATE zu konvertierende Zeichenfolgenliteral muss die Form yyyy-mm-dd haben . Das funktioniert jetzt, wenn Ihre Daten Daten sind und haben keinen Zeitanteil. Wenn Ihre Datumsangaben nun einen Zeitanteil haben, werden die Dinge schwieriger, da MySQL das DATE() verwendet Funktion, um den Datumsteil zu erhalten, während Oracle TRUNC() verwenden würde . Aber Sie können das umgehen, indem Sie >= vernünftig verwenden und < , z. B.:

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

Wenn Sie nun SYSDATE verwenden möchten verwenden Sie am besten den ANSI-Standard CURRENT_DATE oder CURRENT_TIMESTAMP . Diese können ohne Formatierung direkt verglichen werden und sollten sowohl in MySQL als auch in Oracle funktionieren. Sie können auch Datumsarithmetik mit INTERVAL durchführen , in diesem Fall könnten Sie Folgendes versuchen:

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

AKTUALISIEREN Ich habe mir darüber Gedanken gemacht. Die unmittelbar obige Abfrage funktioniert nicht wirklich, wenn Sie alle Zeilen abrufen möchten, die heute eingegeben wurden . Die Schwierigkeit besteht darin, dass Oracle ANSI-Datumsliterale als Datumsangaben erkennt (d. h. ohne Zeitanteil), aber meines Wissens gibt es keine ANSI-Standardmethode zum Konvertieren von Datum/Uhrzeit Wert (der ein Oracle DATE ist) zu einem Datum . Allerdings unterstützen sowohl Oracle als auch MySQL die EXTRACT()-Funktion, also sollten Sie Folgendes tun können, um heute zu erhalten Aufzeichnungen von :

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

Definitiv unhandlich, besonders wenn man mehr als ein Datum berücksichtigen muss (was ich annehme, da Sie den IN verwenden Operator), sollte aber auf beiden Plattformen funktionieren. Siehe SQL Fiddle Demo hier (MySQL) und hier (Oracle) .