【问题标题】:SQL Query for range of dates日期范围的 SQL 查询
【发布时间】:2009-05-13 05:51:31
【问题描述】:

让我们再次提出问题---

  table1{date, bID, sName, fID}
    {11/05,B1,A1,P1}
    {12/05,B2,A2,P2}
    {13/05,B1,A3,P1}
    {15/05,B3,A4,P1}
    {16/05,B1,A5,P2}
    {19/05,B1,A6,P2}

这是表,表中存储的数据也是指定的……

现在我想要的查询是:-

取决于 fId(比如说,选择了 P1),它应该显示表中的数据,比如 11/05-17/05(不应该错过任何日期)。检索到的数据如下:-

11/05,B1,A1
12/05,--,--
13/05,B1,A3
14/05,--,--
15/05,B3,A4
16/05,--,--
17/05,--,--

显示为特定 fID(例如 P1)检索的数据。解释结果...

1) 它显示了 11/05-17/05 的所有数据,其中 fId 为 P1,如果数据库中没有日期,那么它也应该显示该日期的空值(即 14/05 日期不存在在数据库中,但它仍然显示为空值)..

2) 如果该特定日期的 fId 不是 P1,那么它也在结果集中存储一个空值..

最后在结果集中检索数据,并进一步处理..

所以我想为这个问题编写查询,是否可能..

【问题讨论】:

  • 你想要 4 个结果集或 1 个......我的猜测是 1 但在你的 Q 中你说的是 4
  • 如果结果来自 1 个结果集,那就太好了,但是 4 个也可以......
  • 更精确。您想要一个查询,结果是每个日期和 bID 一行?那是对的吗?你还想看什么?最好写下给定示例数据所需的结果。那么知道日期和出价是否唯一就很重要了。
  • 你使用的是什么服务器?
  • 嗯,两个答案都是正确的.. 但它的约束是我不能对两个答案都标记为正确。还是你们摇滚。非常感谢..

标签: sql date-range


【解决方案1】:

这里没有代码,只是我的想法。

您需要创建一个临时表,其中包含从开始日期到结束日期的日期(包括日期)。然后left jointable1date 列上的临时表加上where fID = ?

【讨论】:

  • 此查询将起作用,我将构建此查询.. 但没有任何最短路径,因为我每次都必须在我的 java 源代码中创建这个临时表并插入值,然后进行相应的查询,这将涉及到与数据库的大量交互......
  • 为什么要在 Java 代码中创建临时表?我猜 MySQL 应该能够直接在发送到服务器的 SQL 中创建临时表。
  • 没关系,但是每次我需要修改日期范围时,java代码必须指定范围,n要求从临时表中删除数据,然后相应地插入日期..
  • okeys...很好..我会尝试将此逻辑合并到我的代码中..非常感谢先生..thnx..
【解决方案2】:

正如这里的另一个答案所提到的,您需要一个包含所有日期的表格和一个LEFT JOIN

假设你有这张桌子:

CREATE TABLE table1
{
    date    DATETIME
    bID     VARCHAR(10),
    sName   VARCHAR(10),
    fID     VARCHAR(10)
}

然后是这个日期表:

CREATE TABLE dates
(
    dt      DATETIME
)

在此表中,您需要包含要显示的范围的所有日期。通常你会在两个方向上填充几年,但这取决于你。

注意:为简单起见,我没有在任何一个表中使用主键。你当然应该确保你有一个主键,对于dates 表,它可能是dt 列。

然后显示你想要的结果:

SELECT
    dt,
    bID,
    sName
FROM
    dates
    LEFT JOIN table1 ON dt = date AND fld = 'P1'
ORDER BY
    dt

请注意,仅P1 行的选择是在JOIN 标准中完成的。如果您添加 WHERE 子句来做同样的事情,您将丢失所有没有数据的日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多