给定两个日期和时间的 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) ) )
我需要获取从输入的日期和时间到剩余的日期和时间的用户列表(但如果没有输入日期和时间,也要给出结果)。此查询的结果有问题,尤其是当我键入 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) ) )