Oracle vs. Hypersonic SQL
Domanda
Ho bisogno di selezionare in base alla data in una query SQL, ad esempio
SELECT * FROM foo WHERE date = '2009-09-09'
Questa query funziona nel mio database di prova Hypersonic, ma non Oracle, che sembra richiede:
SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')
C'è un modo per selezionare in base alla data in modo uniforme in questi due database?
Soluzione
Ho trovato la risposta - è possibile creare la funzione TO_DATE in ipersonici e poi la seconda query funziona in entrambi. Ad esempio, rendere la classe:
public class Date {
public static String toDate( String value, String format ) {
return value;
}
}
E la query
SELECT * FROM foo WHERE date = TO_DATE('2009-09-09', 'yyyy-mm-dd')
lavora a entrambi.
Altri suggerimenti
Si potrebbe provare a database di H2 come il database in memoria ( http://www.h2database.com ). Esso dovrebbe avere decente Oracle modalità compablity .
HSQLDB 2.0 supporta ANSI data letterali altrettanto Oracle. Quindi, se è possibile aggiornare a HSQLDB 2.0, è possibile utilizzare:
SELECT * FROM foo WHERE date_column = DATE '2009-09-09'
in entrambi i database (in realtà molto più database anche)
A "data = 'letterale di stringa'" predicato in Oracle è di solito non è raccomandato - è sensibile alle impostazioni NLS_DATE_FORMAT e spesso porta a malintesi su quello che stai cercando in un set di risultati (nel tuo esempio sopra vuoi tutti i record per il giorno o solo quelli creati esattamente a mezzanotte?)
Se avete bisogno di una stringa di query uniforme per entrambi i database, è possibile rinominare la tabella in Oracle e creare una vista con il nome foo e gettato la data tipo di dati a varchar2 nella logica vista. Avrete probabilmente bisogno di aggiungere un indice basato su funzioni al tavolo per consentire la ricerca efficiente sul valore rifusione.
Se è possibile, è possibile impostare il NLS_DATE_FORMAT in sessione Oracle, in questo modo non è necessario utilizzare la funzione TO_DATE, Oracle farà questo per voi dietro le quinte.
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>