A Oracle vs. Hypersonic SQL
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?
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 ??p>
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>