Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Função de formato de data comum para Oracle-sql e Mysql


Primeiro, no MySQL as datas geralmente têm o seguinte formato quando convertidas implicitamente - 2015-01-16 - em vez de 20150116 . Eu acho que você pode fazer o seguinte no MySQL e Oracle (é SQL padrão) - eu verifiquei no Oracle (10g) e funciona, e parece funcionar em minhas brincadeiras com MySQL :
SELECT * FROM mytable
 WHERE mydate IN ( DATE '2015-01-16', DATE '2015-01-18' );

A string literal a ser convertida para DATE deve estar no formato yyyy-mm-dd . Agora isso funcionará se suas datas forem datas e não tem uma porção de tempo. Agora, se suas datas tiverem uma porção de tempo, as coisas se tornarão mais difíceis, pois o MySQL usa o DATE() função para obter a parte da data, enquanto o Oracle usaria TRUNC() . Mas você pode contornar isso com o uso criterioso de >= e < , por exemplo.:
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' );

Agora, se você quiser usar SYSDATE , o melhor a fazer seria usar o padrão ANSI CURRENT_DATE ou CURRENT_TIMESTAMP . Estes podem ser comparados diretamente sem necessidade de formatação e devem funcionar tanto no MySQL quanto no Oracle. Você também pode fazer aritmética de datas usando INTERVAL , nesse caso você pode tentar o seguinte:
SELECT * FROM mytable
 WHERE mydate > CURRENT_DATE - INTERVAL '1' DAY;

ATUALIZAÇÃO Tenho andado a pensar nisso. A consulta imediatamente acima não funciona se você quiser obter todas as linhas que foram inseridas hoje . A dificuldade é que o Oracle reconhece literais de data ANSI como datas (ou seja, sem porção de tempo), mas não há, até onde eu saiba, uma maneira padrão ANSI de converter uma data/hora valor (que um Oracle DATE é) para uma data . Dito isso, tanto o Oracle quanto o MySQL suportam a função EXTRACT(), então você deve ser capaz de fazer o seguinte para obter hoje 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 se houver mais de uma data a considerar (o que eu suponho que você faça, pois está usando o IN operador), mas deve funcionar em ambas as plataformas. Veja a demonstração do SQL Fiddle aqui (MySQL) e aqui (Oracle) .