SQL-запрос на день недели в Java EE — HSQLDB против Postgres

У меня есть приложение JavaEE, основное работает на докере с PostgreSQL, тесты работают с HSQLDB,

В запросе я хочу проверить день недели (чтобы исключить выходные из собранных данных)

В Postgres работает следующее:

extract(dow from date) != 0 AND extract(dow from date) != 6

При использовании HSQLDB это приводит к:

Внутреннее исключение: java.sql.SQLSyntaxErrorException: неожиданный токен: DOW

Для HSQLDB мне нужно будет использовать:

DAYOFWEEK(date) != 1 AND DAYOFWEEK(date) != 7

Но это, конечно, не работает с PostgreSQL:

Вызвано: org.postgresql.util.PSQLException: ОШИБКА: функция dayofweek (дата) не существует

Любая идея, как унифицировать это?

Я думаю, установить один и тот же тип базы данных в файле persistance.xml resources.xml для тестов и приложения? Но мне интересно, есть ли какая-нибудь функция SQL, которую я мог бы использовать для обоих без повторного редактирования файлов xml?


person pearinthemountains    schedule 09.02.2017    source источник
comment
Еще один хороший пример того, почему запускать тесты на другой СУБД, а не на производственной, не стоит.   -  person a_horse_with_no_name    schedule 09.02.2017
comment
Не могли бы вы попробовать escape-функцию JDBC {fn DAYOFWEEK(date)}. Теоретически все драйверы JDBC должны выполнять распаковку для правильной конкретной функции базы данных, но они не всегда делают это.   -  person Mark Rotteveel    schedule 09.02.2017
comment
Кстати: диапазон выхода этой функции должен быть 1..7, где 1 — воскресенье.   -  person Mark Rotteveel    schedule 09.02.2017
comment
Если вы нашли решение, добавьте ответ и примите этот ответ. Не вкладывайте решение в вопрос.   -  person a_horse_with_no_name    schedule 13.02.2017


Ответы (2)


Я только что проверил предложение Марка использовать JDBC. escapes, а следующее работает как с HSQLDB, так и с Postgres:

{fn DAYOFWEEK(date)} <> 0 AND {fn DAYOFWEEK(date)} <> 6
person a_horse_with_no_name    schedule 13.02.2017

решено:

Я использовал JPQL NamedQuery (я использовал NativeQuery) с переданным параметром списка LocalDates (с выходными и праздничными днями),

в запросе в разделе WHERE я набрал:

'myDay not in :listOfWeekendsAndHolidays'
person pearinthemountains    schedule 15.02.2017