如何在1月份提取上个月的数据

时间:2015-01-14 22:16:13

标签: sql db2

我有一个嵌入式查询,用于提取上个月的数据。一直工作到本月(1月)。我的代码如下所示:

(MONTH(CURRENT DATE)-1) = MONTH(TSTAMP)

我有这样设置,因为我的数据中有一个时间戳,我将查询作为基础。这通常就像一个魅力,但它本月没有工作,我认为这是因为新的一年。处理不同年份时,此功能如何运作?有没有办法将它写入查询中,所以我不必担心一年中的变化?

2 个答案:

答案 0 :(得分:0)

您可以使用年份来完成此操作,如下所示:

YEAR(CURRENT DATE) * 12 + MONTH(CURRENT DATE) - 1 = YEAR(TSTAMP) * 12 + MONTH(TSTAMP)

从本质上讲,这将日期转换为从0开始的几个月 - 所以-1是有道理的。

答案 1 :(得分:0)

执行此操作的正确方法是使用范围查询(也是一个with an exclusive upper-bound, <),以便db可以免费获取索引(如果有)。
可以通过以下方式轻松检索本月的第一天:

CURRENT_DATE - (DAY(CURRENT_DATE) - 1) DAYS

(减去当前日期与月初之间的天数差异)

这为查询提供了一个很好的上限条件:

WHERE tStamp < CURRENT_DATE - (DAY(CURRENT_DATE) - 1) DAYS

(在当月开始之前获取所有内容)。

然而,由于我们真的只对前一个月感兴趣,我们还需要限制下限。那个月以来或者那个月开始的所有内容......因为我们已经可以开始当前月了:

WHERE tStamp >= CURRENT_DATE - (DAY(CURRENT_DATE) - 1) DAYS + 1 MONTH
      AND tStamp < CURRENT_DATE - (DAY(CURRENT_DATE) - 1) DAYS

<小时/> 有一种相关的方法可以做到这一点,假设你有一个带有适当索引的日历表。如果您有一个包含这些列的最小表:

calendarDate - DATE
year         - INTEGER
month        - INTEGER
dayOfMonth   - INTEGER

...您可以使用此表来获取相关值:

WHERE tStamp >= (SELECT calendarDate
                 FROM calendarTable
                 WHERE year = YEAR(CURRENT_DATE - 1 MONTH)
                       AND month = MONTH(CURRENT_DATE - 1 MONTH)
                       AND dayOfMonth = 1)
      AND tStamp < (SELECT calendarDate
                    FROM calendarTable
                    WHERE year = YEAR(CURRENT_DATE)
                          AND month = MONTH(CURRENT_DATE)
                          AND dayOfMonth = 1)

(这里有几种不同的形式,但这个看起来非常简单)