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?

È stato utile?

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> 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top