WHERE 日期范围内多列中的至少一列

Posted

技术标签:

【中文标题】WHERE 日期范围内多列中的至少一列【英文标题】:WHERE at least one of multiple columns in date range 【发布时间】: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。

【问题讨论】:

我认为没有更好的方法来编写这个查询。 为什么不使用占位符? 用您正在使用的数据库标记您的问题。 【参考方案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)

【讨论】:

以上是关于WHERE 日期范围内多列中的至少一列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 多列与单个范围/图例对齐

如何在 Yajra dataTable 的页脚中设置“总计”以获取每页或至少在末尾的一列或多列的“总计”

excel多列合并成一列: 如1 2 3 合并成123在一列里面用逗号隔开

Spark SQL一列拆分多列

SQL中的Group By的查询过程多列分组的查询过程是怎样的?

excel中能否将一列数据分成多列?