Оракул противГиперзвуковой SQL
Вопрос
Мне нужно выбрать по дате в 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>