我有一个嵌入式查询,用于提取上个月的数据。一直工作到本月(1月)。我的代码如下所示:
(MONTH(CURRENT DATE)-1) = MONTH(TSTAMP)
我有这样设置,因为我的数据中有一个时间戳,我将查询作为基础。这通常就像一个魅力,但它本月没有工作,我认为这是因为新的一年。处理不同年份时,此功能如何运作?有没有办法将它写入查询中,所以我不必担心一年中的变化?
答案 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)
(这里有几种不同的形式,但这个看起来非常简单)