Question

Je dois sélectionner par date dans une requête SQL, par exemple

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

Cette requête fonctionne dans ma base de données de test Hypersonic, mais pas Oracle, qui semble nécessite:

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

Est-il possible de sélectionner par date uniformément sur ces deux bases de données?

Était-ce utile?

La solution

J'ai trouvé la réponse - vous pouvez créer la fonction TO_DATE dans HyperSonic puis la deuxième requête fonctionne dans les deux. Par exemple, faire la classe:

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

Et la requête

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

fonctionne dans les deux.

Autres conseils

Vous pouvez essayer base de données H2 comme base de données dans la mémoire ( http://www.h2database.com ). Il devrait y avoir décent le mode Oracle compablity .

HSQLDB 2.0 prend en charge les littéraux date ANSI comme Oracle. Donc, si vous pouvez passer à HSQLDB 2.0, vous pouvez utiliser:

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

dans les deux bases de données (en fait beaucoup plus de bases de données même)

A « date = « chaîne de caractères » » prédicat dans Oracle est généralement pas recommandé - il est sensible aux paramètres de NLS_DATE_FORMAT et conduit souvent à des malentendus sur ce que vous recherchez dans un jeu de résultats (dans votre exemple faire ci-dessus voulez-vous tous les records pour la journée ou tout simplement ceux qui sont créés exactement à minuit?)

Si vous avez besoin d'une chaîne de requête uniforme pour les deux bases de données, vous pouvez renommer la table Oracle et créer une vue avec le nom foo et jeter la date DataType varchar2 dans la logique de la vue. Vous aurez probablement besoin d'ajouter un index basé sur une fonction à la table pour permettre une recherche efficace sur la valeur refondu.

Si vous pouvez, vous pouvez configurer votre NLS_DATE_FORMAT en session Oracle, de cette façon vous n'avez pas besoin d'utiliser la fonction TO_DATE, oracle fera pour vous dans les coulisses.

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> 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top