如何提取一月份的上个月数据

How to pull previous month data for in January

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

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

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

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

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

这实质上是将日期转换为从时间 0 开始的月数——因此 -1 有意义。

执行此操作的正确方法是使用范围查询(也是一个 with an exclusive upper-bound, <),这样数据库就可以免费为我们提供一个索引(如果有的话)。
可以通过以下方式轻松检索本月的第一天:

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

有一种相关的方法可以做到这一点,假设您有一个带有适当索引的日历 table。如果这些列的最小值 table:
calendarDate - DATE
year         - INTEGER
month        - INTEGER
dayOfMonth   - INTEGER

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

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)

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