我有一个嵌入式查询,用于提取上个月的数据。直到本月(一月),一切都一直正常。我的代码看起来像这样:如何在1月份提取上个月的数据
(MONTH(CURRENT DATE)-1) = MONTH(TSTAMP)
我有它设置这种方式,因为我有一个时间戳在我的数据,我基于查询。这通常就像一个魅力,但它本月不工作,我认为这是因为新的一年。这个功能在处理不同年份时如何工作?有没有办法将它写入查询,所以我不必担心一年中会发生变化?
我有一个嵌入式查询,用于提取上个月的数据。直到本月(一月),一切都一直正常。我的代码看起来像这样:如何在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
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)
(有一对夫妇的不同形式的这一点,但这个看起来很简单)
工作就像一个绝对的魅力!我感谢你的时间和努力。我会在大约9分钟内接受这个答案,当它允许我时。 –
......当然会忽略指数。 –