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 日期范围内多列中的至少一列的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Yajra dataTable 的页脚中设置“总计”以获取每页或至少在末尾的一列或多列的“总计”
excel多列合并成一列: 如1 2 3 合并成123在一列里面用逗号隔开