2015-01-14 34 views
1

我有一个嵌入式查询,用于提取上个月的数据。直到本月(一月),一切都一直正常。我的代码看起来像这样:如何在1月份提取上个月的数据

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

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

回答

0

可以使用一年,像这样做:

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

这在本质上,日期转换成个月以来的时间0 - 所以-1是有道理的。

+0

工作就像一个绝对的魅力!我感谢你的时间和努力。我会在大约9分钟内接受这个答案,当它允许我时。 –

+0

......当然会忽略指数。 –

0

执行此操作的正确方法是使用范围查询(也可以使用一个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 


有一个相关的办法做到这一点,假设你有适当指数的日历表。如果你有一个最小的表,这些列:

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) 

(有一对夫妇的不同形式的这一点,但这个看起来很简单)