循环通过日期

时间:2014-03-05 13:54:21

标签: sql date loops

我们有一个表来跟踪仓库中的物品:

-------------------------
ID     DATEIN     DATEOUT
-------------------------

我们需要的是每周仓库中物品数量的清单。

这是我们已经走了多远:

SELECT
    COUNT (ID)
FROM
    table
WHERE
    table.DATEIN<=#somedate1#
    AND
    (
        table.DATEOUT>#somedate1#
        OR
        table.DATEOUT IS NULL
    )

这为我们提供了日期#somedate1#中仓库中的物品数量。但是,我们需要每周的金额列表。 (请记住,有些物品可能会在仓库中存放数月)

棘手的部分不是本周,我们可以使用DATEPART(“ww”,#somedate1#),但循环使用日期。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你试过吗?

        SELECT
            DATEPART("ww","D"),COUNT (ID)
        FROM
            (
             SELECT Table.DATEIN as D
             FROM table 
             WHERE table.DATEIN<=#somedate1# AND ( table.DATEOUT>#somedate1# OR   table.DATEOUT IS NULL)
             UNION ALL
             SELECT Table.DATEOUT as D 
             FROM table 
             WHERE table.DATEIN<=#somedate1# AND ( table.DATEOUT>#somedate1# OR table.DATEOUT IS NULL)
            )
        GROUP BY DATEPART("ww","D")

首先,您需要制作UNION以确保拥有所有DATEINDATEOUT,然后才能GROUP BY

答案 1 :(得分:0)

到目前为止,我们已经提出了这个问题。

此代码列出了物品进入仓库或离开的所有日期。这些是我们在第一篇文章中应用代码所需的日期。即我们需要遍历这些日期,对于每次迭代,下一个日期用作#somedate1#

SELECT
    table.DATEIN AS DATE
FROM
    table
GROUP BY
    table.DATEIN
UNION
SELECT
    table.DATEOUT AS DATE
FROM
    table
WHERE
    table.DATEOUT NOT IN (
        SELECT
            table.DATEIN
        FROM
            table
        GROUP BY
            table.DATEIN
    )
GROUP BY
    table.DATEOUT

我们仍然坚持我们如何循环使用它们。我们尝试的所有内容都会产生我们不期望的奇怪结果。

答案 2 :(得分:0)

我们得到了它!答案一直盯着我们。这就是诀窍:

SELECT
    COUNT (table1.ID),
    table2.DATE
FROM
    table1,
    (
        SELECT
            table1.DATEIN AS DATE
        FROM
            table1
        GROUP BY
            table1.DATEIN
        UNION
        SELECT
            table1.DATEOUT AS DATE
        FROM
            table1
        WHERE
            table1.DATEOUT NOT IN (
                SELECT
                    table1.DATEIN
                FROM
                    table1
                GROUP BY
                    table1.DATEIN
            )
        GROUP BY
            table1.DATEOUT
    ) table2
WHERE
    table1.DATEIN<=table2.DATE
    AND
    (
        table1.DATEOUT>table2.DATE
        OR
        table1.DATEOUT IS NULL
    )
GROUP BY
    table2.DATE