2009-12-19 3 views
2

Я пытаюсь выявить базу данных с поддержкой Oracle с помощью hsqldb и dbunit, но я столкнулся с проблемой.Преобразование Oracle date арифметики для работы в HSQLDB

Проблема заключается в следующем EJB-QL (немного упрощен):

SELECT o 
FROM Offer o 
WHERE :nowTime 
    BETWEEN o.startDate AND o.startDate + 7 

Это, кажется, работает только в версии Oracle о SQL.

Какой самый простой способ для меня преобразовать это для работы как в hsqldb, так и в oracle? Предположим, что изменение двух между аргументами названных параметров очень трудно рефакторинг, поэтому я буду благоволить ответы, что обеспечивает более стандартизированный аналог

o.startdate + 7


EDIT: После этого некоторые дополнительные исследования, это выглядит например, Oracle преобразует приведенный выше фрагмент в

o.startdate + INTERVAL '7' DAY
, который, по-видимому, более стандартен, но не работает в HSQLDB.

ответ

4

HSQLDB 2.0 (выпущен в 2010 году) поддерживает синтаксис.

SELECT o 
FROM Offer o 
WHERE nowTime 
    BETWEEN o.startDate AND o.startDate + 7 DAY 

Также Suppports

o.startdate + INTERVAL '7' DAY 

Обновление:

В режиме совместимости ОРА введен с HSQLDB 2.2, выражение o.startDate + 7 также поддерживается.

+0

О, Боже, спасибо заранее – deFreitas

0

Синтаксис HSQLDB для обработки даты сильно отличается от Oracle. Ваш лучший шанс - написать хранимую процедуру в Oracle DB, которая имитирует поведение функций/процедур HSQLDB.

+0

Я тестирую Oracle SQL с помощью HSQLDB в памяти для проведения быстрых интеграционных тестов. Мутирование базы данных Oracle исключительно для того, чтобы мои работы по тестированию выглядели как действительно плохая идея. –

1

Ваша методология кажется правильной. Я не знаю, с чем вы столкнулись. Это работает в Oracle и HSQLDB, используя скрипт ниже:

CREATE TABLE OFFER (ID INTEGER, STARTDATE DATE); 
INSERT INTO OFFER (ID, STARTDATE) VALUES (1, DATE '2009-01-01'); 
SELECT ID, STARTDATE, STARTDATE + INTERVAL '7' DAY FROM OFFER; 

В обеих средах я получаю результаты, показывающие первый и восьмой января.