Pergunta

Eu preciso selecionar por data em uma consulta SQL, por exemplo

SELECT * FROM foo WHERE date = '2009-09-09'

Essa consulta funciona no meu banco de dados de teste Hypersonic, mas não Oracle, que parece requer:

SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')

Existe uma maneira de selecionar por data uniformemente estas duas bases de dados?

Foi útil?

Solução

Eu encontrei a resposta - você pode criar a função TO_DATE em HyperSonic e depois a segunda consulta funciona em ambos. Por exemplo, fazer a classe:

public class Date {
    public static String toDate( String value, String format ) {
        return value;
    }
}

E a consulta

SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')

trabalhos em ambos.

Outras dicas

Você poderia tentar banco de dados H2 como o seu na memória de banco de dados ( http://www.h2database.com ). Ela deve ter decente a Oracle modo compablity .

HSQLDB 2.0 suporta ANSI literais de data apenas como Oracle. Então, se você pode atualizar para HSQLDB 2.0, você pode usar:

SELECT * 
FROM foo 
WHERE date_column = DATE '2009-09-09'

tanto em banco de dados (na verdade muito mais bancos de dados mesmo)

A "data = 'string literal'" predicado no Oracle geralmente não é recomendado - é sensível a ajustes NLS_DATE_FORMAT e muitas vezes leva a mal-entendidos sobre o que você está procurando em um conjunto de resultados (no seu exemplo acima que você quer todos os registros para o dia ou apenas aqueles criados exatamente à meia-noite?)

Se você precisar de uma seqüência de consulta uniforme para ambos os bancos de dados, você pode mudar o nome da tabela no Oracle e criar uma exibição com o nome foo e lançou o tipo de dados de data para varchar2 na lógica vista. Você provavelmente vai precisar adicionar um índice baseado em função para a mesa para permitir uma pesquisa eficiente sobre o valor reformulação.

Se você pode, você pode definir o seu NLS_DATE_FORMAT em sessão Oracle, dessa forma você não precisa usar a função TO_DATE, a Oracle vai fazer isso por você nos bastidores.

SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';

VALUE
----------------------------------------------------------------
DD/MM/YYYY

SQL> create table nls_date_test ( id number(10) , date_entered date );

Table created.

SQL> insert into nls_date_test values ( 1 , '31/05/2009' );

1 row created.

SQL> insert into nls_date_test values ( 2 , '30/05/2009' );

1 row created.

SQL> select * from nls_date_test where date_entered = '2009-09-09';
select * from nls_date_test where date_entered = '2009-09-09'
                                                  *
ERROR at line 1:
ORA-01861: literal does not match format string


SQL> alter session set nls_date_format = 'YYYY-MM-DD';

Session altered.

SQL> select * from nls_date_test where date_entered = '2009-05-30';

        ID DATE_ENTER
---------- ----------
         2 2009-05-30

SQL> select value from v$nls_parameters where parameter = 'NLS_DATE_FORMAT';

VALUE
----------------------------------------------------------------
YYYY-MM-DD

SQL> 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top