Oracle против гиперзвукового SQL - PullRequest
0 голосов
/ 29 мая 2009

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 29 мая 2009

Я нашел ответ - вы можете создать функцию 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')

работает в обоих.

1 голос
/ 21 ноября 2010

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

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

в обеих базах данных (фактически даже больше баз данных)

1 голос
/ 29 мая 2009

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

0 голосов
/ 31 мая 2009

Если вы можете, вы можете установить свой 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> 
0 голосов
/ 29 мая 2009

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

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

...