如何提取一月份的上个月数据
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)
(有几种不同的形式,但这个看起来很简单)
我有一个嵌入式查询,用于提取上个月的数据。直到本月(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)
(有几种不同的形式,但这个看起来很简单)