Запрос HSQLDB с двумя датами и временем

Мне нужно получить список пользователей от даты и времени, введенных до даты и времени, оставшихся (но также дать результаты, если дата и время не введены). Что-то не так с результатами этого запроса, особенно когда я набираю дату / время в / слева. Форма поиска работает для остальных полей (таких как Имя, Номер транспортного средства, Уровень, Единица).

SELECT * FROM "tblVehicles"
WHERE
((UPPER("Name") LIKE '%' ||

UPPER(:VAR_NAME) || '%')

OR

(:VAR_NAME is NULL))

AND

((UPPER("Vehicle Number") LIKE '%' ||

UPPER(:VAR_VEHICLE) || '%')

OR

(:VAR_VEHICLE is NULL))

AND

((UPPER("Level") LIKE '%' ||

UPPER(:VAR_LEVEL) || '%')

OR

(:VAR_LEVEL is NULL))

AND

((UPPER("Unit") LIKE '%' ||

UPPER(:VAR_UNIT) || '%')

OR

(:VAR_UNIT is NULL))

AND

((("Date In" >= :VAR_DATEIN) AND ("Time In" >= :VAR_TIMEIN))

OR

((:VAR_DATEIN is NULL)

OR

(:VAR_TIMEIN is NULL)))

AND

((("Date Left" <= :VAR_DATELEFT) AND ("Time Left" <= :VAR_TIMELEFT))



OR

((:VAR_DATELEFT is NULL)

OR

(:VAR_TIMELEFT is NULL)))

2 ответа

Решение

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

дизайн таблицы tblVehicles

В диалоговом окне ввода данных щелкните правой кнопкой мыши столбцы даты и отформатируйте как YYYY-MM-DDи столбцы времени HH:MM, Эти форматы наименее неоднозначны. Затем введите следующие данные.

ввод данных таблицы

Теперь создайте следующий запрос в представлении SQL.

SELECT * FROM "tblVehicles"
WHERE ((("Date In" >= :VAR_DATEIN) AND ("Time In" >= :VAR_TIMEIN))
    OR ((:VAR_DATEIN is NULL)
    OR (:VAR_TIMEIN is NULL)))
AND ((("Date Left" <= :VAR_DATELEFT) AND ("Time Left" <= :VAR_TIMELEFT))
    OR ((:VAR_DATELEFT is NULL)
    OR (:VAR_TIMELEFT is NULL)))

Затем запустите запрос. Войти 2017-02-01 для VAR_DATEIN, который автоматически корректируется в #02/01/2017, Войти 8:00 для VAR_TIMEIN, который автоматически корректируется в #08:00:00#,

параметры запроса

Результат:

вывод запроса

Существует часто задаваемые вопросы для базы, которая описывает диапазоны дат: https://wiki.documentfoundation.org/Faq/Base/122.

Это не ответ на ваш вопрос, а скорее наблюдения и предложения по технике. У большинства, если не у всех нас сегодня есть широкие экраны, которые могут легко вместить длинные текстовые строки. Я предлагаю вам использовать хороший редактор и расширить его, а затем выровнять свою логику по столбцам, как я сделал для вас ниже, чтобы вам было легче видеть, что вы делаете. (Другими словами, скопируйте и вставьте приведенный ниже SQL-код в ваш широкий текстовый редактор, чтобы вы могли увидеть, как он выглядит там.)

Вы заметите, что я использовал 2 пробела для внешних паренов, 1 пробел для следующего и 0 пробелов для большинства внутренних паренов. Кроме того, я выровнял вещи, так что легко увидеть, что это большой набор AND, состоящий из OR.

Это было очень давно, когда я познакомился с таким форматированием. Они называли это "красивая печать" в то время. Это послужило мне хорошо за эти годы. Похоже, программисты в значительной степени забыли этот простой метод, но я надеюсь, что вы можете использовать его. Иногда логика сложна, и самое главное - легко увидеть, как она работает.

.Удачи тебе!

SELECT * FROM "tblVehicles"
WHERE 
(  (  UPPER("Name"          ) LIKE '%' || UPPER(:VAR_NAME   ) || '%'   ) OR   (:VAR_NAME     is NULL)                               ) AND
(  (  UPPER("Vehicle Number") LIKE '%' || UPPER(:VAR_VEHICLE) || '%'   ) OR   (:VAR_VEHICLE  is NULL)                               ) AND
(  (  UPPER("Level"         ) LIKE '%' || UPPER(:VAR_LEVEL  ) || '%'   ) OR   (:VAR_LEVEL    is NULL)                               ) AND
(  (  UPPER("Unit"          ) LIKE '%' || UPPER(:VAR_UNIT   ) || '%'   ) OR   (:VAR_UNIT     is NULL)                               ) AND

(  ( ("Date In"   >= :VAR_DATEIN  ) AND ("Time In"   >= :VAR_TIMEIN  ) ) OR ( (:VAR_DATEIN   is NULL) OR (:VAR_TIMEIN   is NULL) )  ) AND
(  ( ("Date Left" <= :VAR_DATELEFT) AND ("Time Left" <= :VAR_TIMELEFT) ) OR ( (:VAR_DATELEFT is NULL) OR (:VAR_TIMELEFT is NULL) )  )
Другие вопросы по тегам