sql >> Base de Datos >  >> RDS >> Mysql

Función de formato de fecha común para Oracle-sql y Mysql

En primer lugar, en MySQL, las fechas suelen tener el siguiente formato cuando se convierten implícitamente:2015-01-16 - en lugar de 20150116 . Creo que puedes hacer lo siguiente en MySQL y Oracle (es SQL estándar):lo verifiqué en Oracle (10g) y funciona, y parece funcionar en mi manipulación de MySQL :

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

El literal de cadena que se convertirá a FECHA debe tener la forma yyyy-mm-dd . Ahora esto funcionará si sus fechas son fechas y no tienen una porción de tiempo. Ahora, si sus fechas tienen una porción de tiempo, entonces las cosas se vuelven más difíciles ya que MySQL usa DATE() función para obtener la parte de la fecha, mientras que Oracle usaría TRUNC() . Pero puede evitarlo con un uso juicioso de >= y < , por ejemplo:

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

Ahora, si desea utilizar SYSDATE , lo mejor sería usar el estándar ANSI CURRENT_DATE o CURRENT_TIMESTAMP . Estos se pueden comparar directamente sin necesidad de formatear y deberían funcionar tanto en MySQL como en Oracle. También puedes hacer aritmética de fechas usando INTERVAL , en cuyo caso podría intentar lo siguiente:

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

ACTUALIZAR He estado pensando un poco en esto. La consulta inmediatamente anterior realmente no funciona si desea obtener todas las filas que se ingresaron hoy . La dificultad es que Oracle reconoce los literales de fecha ANSI como fechas (es decir, sin parte de tiempo), pero no existe, que yo sepa, una forma estándar ANSI de convertir una fecha/hora valor (que un Oracle DATE es) a una fecha . Dicho esto, tanto Oracle como MySQL admiten la función EXTRACT(), por lo que debería poder hacer lo siguiente para obtener hoy registros 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);

Definitivamente difícil de manejar, especialmente si uno tiene más de una fecha para considerar (lo cual supongo que sí, ya que está usando el IN operador), pero debería funcionar en ambas plataformas. Vea la demostración de SQL Fiddle aquí (MySQL) y aquí (Oracle) .