SQL查询日期范围

时间:2009-05-13 05:51:32

标签: sql date-range

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

  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,那么它也会在结果集中存储空值。

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

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

2 个答案:

答案 0 :(得分:3)

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

您需要创建一个临时表,其日期范围从开始日期到结束日期(含)。然后left join table1使用date列上的临时表加上where fID = ?

答案 1 :(得分:1)

正如其他答案所提到的那样,一张包含所有日期的表格,以及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子句来执行相同操作,则会丢失所有没有数据的日期。