Mysql
 sql >> Base de données >  >> RDS >> Mysql

Fonction de format de date commune pour Oracle-sql et Mysql

Tout d'abord, dans MySQL, les dates ont généralement le format suivant lorsqu'elles sont converties implicitement - 2015-01-16 - plutôt que 20150116 . Je pense que vous pouvez faire ce qui suit dans MySQL et Oracle (c'est du SQL standard) - Je l'ai vérifié dans Oracle (10g) et cela fonctionne, et cela semble fonctionner dans mes manipulations avec MySQL :

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

Le littéral de chaîne à convertir en DATE doit être de la forme yyyy-mm-dd . Maintenant, cela fonctionnera si vos dates sont des dates et n'ont pas de portion de temps. Maintenant, si vos dates ont une portion de temps, alors les choses deviennent plus difficiles puisque MySQL utilise le DATE() pour obtenir la partie date, alors qu'Oracle utiliserait TRUNC() . Mais vous pouvez contourner cela en utilisant judicieusement >= et < , par exemple :

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

Maintenant, si vous voulez utiliser SYSDATE , la meilleure chose à faire serait d'utiliser la norme ANSI CURRENT_DATE ou CURRENT_TIMESTAMP . Ceux-ci peuvent être comparés directement sans avoir besoin de formatage et devraient fonctionner à la fois dans MySQL et Oracle. Vous pouvez également faire de l'arithmétique de date en utilisant INTERVAL , auquel cas vous pouvez essayer ce qui suit :

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

MISE À JOUR J'ai réfléchi à cela. La requête juste au-dessus ne fonctionne pas vraiment si vous voulez obtenir toutes les lignes qui ont été saisies aujourd'hui . La difficulté est qu'Oracle reconnaît les littéraux de date ANSI comme des dates (c'est-à-dire sans partie de temps), mais il n'y a pas, pour autant que je sache, un moyen standard ANSI de convertir une date/heure valeur (qu'une DATE Oracle est) à une date . Cela dit, Oracle et MySQL prennent tous deux en charge la fonction EXTRACT(), vous devriez donc pouvoir faire ce qui suit pour obtenir aujourd'hui enregistrements de :

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

Certainement difficile à manier, surtout si l'on a plus d'une date à considérer (ce que je suppose que vous faites puisque vous utilisez le IN opérateur), mais devrait fonctionner sur les deux plates-formes. Voir la démo SQL Fiddle ici (MySQL) et ici (Oracle) .