给定两个日期和时间的 HSQLDB 查询

HSQLDB Query given two dates and time

我需要获取从输入的日期和时间到剩余的日期和时间的用户列表(但如果没有输入日期和时间,也要给出结果)。此查询的结果有问题,尤其是当我键入 date/time in/left 时。搜索表单适用于其余字段(如名称、车辆编号、级别、单位)。

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)))

很可能是在参数输入对话框中输入的日期格式不正确。例如,使用以下模式创建一个 tblVehicles 的新数据库。

在数据输入对话框中,right-click 日期列和格式为 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)))

然后运行查询。为 VAR_DATEIN 输入 2017-02-01,自动更正为 #02/01/2017。为 VAR_TIMEIN 输入 8:00,自动更正为 #08:00:00#

结果:

Base 有一个描述日期范围的常见问题解答:https://wiki.documentfoundation.org/Faq/Base/122

这不是对你问题的回答,而是对技术的观察和建议。今天我们大多数人(如果不是所有人)都拥有可以轻松容纳长文本行的宽屏幕。我建议您使用一个好的编辑器并使其变宽,然后按照我在下面为您所做的那样在列中对齐您的逻辑,这样您就可以更轻松地看到您在做什么。 (换句话说,将下面的 SQL 复制并粘贴到您的宽文本编辑器中,这样您就可以看到它在那里的样子。)

你会注意到我使用了 2 个 space 作为外括号,1 个 space 作为下一个输入,0 space 作为最内层的括号。此外,我已经对齐了一些东西,所以很容易看出这是一大堆由 OR 组成的 AND。

很久以前我就知道了这种格式。当时他们称之为"pretty printing"。这些年来它对我很有帮助。似乎程序员基本上已经忘记了这个简单的方法,但我希望你能使用它。有时逻辑很复杂,最重要的是很容易看出它是如何工作的。

.祝你好运!

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) )  )