代码之家  ›  专栏  ›  技术社区  ›  user614454

HSQLDB查询提供了两个日期和时间

  •  0
  • user614454  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  0
  •   Jim K    7 年前

    很可能,参数输入对话框中的日期输入格式不正确。例如,使用 tblVehicles 使用以下架构。

    tblVehicles table design

    在“数据输入”对话框中,右键单击日期列并将其格式设置为 YYYY-MM-DD ,和时间列 HH:MM . 这些格式是最不含糊的。然后输入以下数据。

    table data entry

    现在在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\u DATEIN,自动更正为 #02/01/2017 . 进来 8:00 对于VAR\u TIMEIN,其中自动更正为 #08:00:00# .

    query parameters

    结果:

    query output

    Base有一个常见问题解答,介绍了日期范围: https://wiki.documentfoundation.org/Faq/Base/122 .

        2
  •  0
  •   Elliptical view    7 年前

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

    您会注意到,我使用了2个空格作为外部paren,1个空格作为下一个in,0个空格作为最内部paren。此外,我还对事物进行了对齐,因此很容易看到这是一组由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) )  )