Вопрос

Мне нужно выбрать по дате в SQL-запросе, например

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

Этот запрос работает в моей базе данных Hypersonic test, но не в Oracle, что, по-видимому, требует:

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

Есть ли способ единообразно выбирать по дате в этих двух базах данных?

Это было полезно?

Решение

Я нашел ответ - вы можете создать функцию TO_DATE в HyperSonic, и тогда второй запрос будет работать в обоих.Например, создайте класс:

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

И запрос

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

работает в обоих случаях.

Другие советы

Вы могли бы попробовать базу данных H2 в качестве вашей базы данных в памяти (http://www.h2database.com).В нем должны быть приличные Режим совместимости Oracle.

HSQLDB 2.0 поддерживает литералы даты ANSI так же, как Oracle.Итак, если вы можете перейти на HSQLDB 2.0, вы можете использовать:

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

в обеих базах данных (на самом деле даже намного больше баз данных)

Предикат "date = 'literal string'" в Oracle обычно не рекомендуется - он чувствителен к настройкам NLS_DATE_FORMAT и часто приводит к неправильному пониманию того, что вы ищете в результирующем наборе (в вашем примере выше вам нужны все записи за день или только те, которые созданы ровно в полночь?)

Если вам нужна единая строка запроса для обеих баз данных, вы можете переименовать таблицу в Oracle и создать представление с именем foo и преобразовать тип данных date в varchar2 в логике представления.Вероятно, вам потребуется добавить в таблицу функциональный индекс, чтобы обеспечить эффективный поиск по измененному значению.

Если вы можете, вы можете установить свой NLS_DATE_FORMAT в сеансе Oracle, таким образом, вам не нужно использовать функцию TO_DATE, oracle сделает это за вас за кулисами.

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> 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top