Запрос 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
используя следующую схему.
В диалоговом окне ввода данных щелкните правой кнопкой мыши столбцы даты и отформатируйте как 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) ) )