0

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

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

2 回答 2

0

很可能是在参数输入对话框中没有以正确的格式输入日期。例如,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-01VAR_DATEIN 自动更正为#02/01/2017. 输入8:00VAR_TIMEIN 自动更正为#08:00:00#.

查询参数

结果:

查询输出

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

于 2018-02-28T21:15:39.930 回答
0

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

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

很久以前,当我被介绍到这种格式时。他们当时称其为“漂亮的印刷”。多年来,它对我很有帮助。似乎程序员已经在很大程度上忘记了这个简单的方法,但我希望你能使用它。有时逻辑很复杂,最重要的是要容易地看到它是如何工作的。

。祝你好运!

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) )  )
于 2018-02-28T22:40:31.523 回答