【问题标题】:WHERE at least one of multiple columns in date rangeWHERE 日期范围内多列中的至少一列
【发布时间】:2020-02-28 14:49:51
【问题描述】:

我有一个包含 ID、DATE1、DATE2、DATE3、DATE4 列的表。我可以使用以下查询获得所需的结果:

Select ID from table 
WHERE ((DATE1 >= '2020-01-01' AND DATE1 <= '2020-31-01') 
   OR (DATE2 >= '2020-01-01' AND DATE2 <= '2020-31-01') 
   OR (DATE3 >= '2020-01-01' AND DATE3 <= '2020-31-01') 
   OR (DATE4 >= '2020-01-01' AND DATE4 <= '2020-31-01') )

如您所见,我需要一个 ID 列表,其中至少有一个日期列(DATE1、DATE2、DATE2、DATE4)的日期为 2020 年 1 月。

我编写的查询工作得很好,但我想知道是否有更聪明的方式来编写该查询,以便我只需要提供一次日期范围?

不确定是否重要,但如果重要,我正在运行 DB2。

【问题讨论】:

  • 我认为没有更好的方法来编写这个查询。
  • 为什么不使用占位符?
  • 用您正在使用的数据库标记您的问题。

标签: sql db2


【解决方案1】:

您可以改进查询恕我直言的唯一方法是使用@Jeff Holt 提到的占位符。 但它最终不会改变执行的SQL。

另一种可能性(但这完全取决于您的要求)是将“id”与日期列分开并使用 1:N 关系。

例如可以在多个日期发生的活动:

table `activity`
-------------
| id | name |
|--- | ---- |
| 1  |tennis|
-------------
table `activity_planned`
-----------------------------
| id |activity_id|   date   |
|----|-----------|----------|
| 1  | 1         |2020-02-08|
| 2  | 1         |2020-02-12|
| 3  | 1         |2020-02-11|
| 4  | 3         |2020-03-01|
-----------------------------

这样您还可以轻松添加更多日期,而不仅仅是 4 个。

【讨论】:

    【解决方案2】:

    使用占位符、查询因子和 between 运算符(在您的特定情况下,您包括时间间隔的两端),您可以使像素更紧密且更易于阅读。

    with dates (begin_date, end_date) as
        (select ?, ? from dual)
    Select ID
    from table t join dates d
    WHERE
        (t.DATE1 between d.begin_date AND d.end_date) OR
        (t.DATE2 between d.begin_date AND d.end_date) OR
        (t.DATE3 between d.begin_date AND d.end_date) OR
        (t.DATE4 between d.begin_date AND d.end_date)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2013-03-02
      • 2018-02-03
      • 2020-06-12
      • 2014-01-07
      相关资源
      最近更新 更多