寻找一个mysql查询来计算上个月之前的所有行

时间:2010-12-02 15:35:46

标签: mysql date

为简洁起见,我会跳过“为什么”。但如果你想知道你可以问。但基本上我的第一个任务是找到一种方法来计算当前月份之前的所有行。我发现这个解决方案有效,即:

SELECT COUNT(*) FROM myTable 
WHERE log_date < (CURDATE() -  DAYOFMONTH(CURDATE()))

我只是减去本月发生的天数,并计算日期少于本月第一天的所有行。

下一个问题是我需要在上个月之前统计所有行。我从技术上讲,我可以在上面查看我的结果并查询上个月的结果并减去两个查询。但是我希望对此进行单一查询。我尝试过两种版本的变体:

SELECT COUNT(*) FROM myTable 
WHERE log_date < ((CURDATE()- DAYOFMONTH(CURDATE())) - INTERVAL 1 MONTH)

SELECT COUNT(*) FROM myTable 
WHERE log_date < DATE_SUB((CURDATE()- DAYOFMONTH(CURDATE())), INTERVAL 1 MONTH)

当我知道答案应该是14时,这两种方法以及我的一些变化尝试得到0的结果。

有没有办法在单个查询中找到我要找的答案?

感谢。

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT COUNT(*) FROM `myTable` WHERE `log_date` BETWEEN "2010-11-01 00:00:00" AND "2010-11-30 23:59:59"

答案 1 :(得分:0)

好的,我想我得到了你想要的东西。

您有2个日期,并希望在每个日期之前记录COUNT

SELECT
SUM(IF(log_date<DATESUB(CURDATE()-DAYOFMONTH(CURDATE())), 1, 0)) AS LAST_MONTH,
SUM(IF(log_date<DATE_SUB((CURDATE()-DAYOFMONTH(CURDATE())),INTERVAL 1 MONTH),1,0) 
AS PREV_MONTH
FROM ....
WHERE log_date < DATESUB(CURDATE() - DAYOFMONTH(CURDATE()));

通过COUNT结合SUM,您可以通过2次模拟IF

我假设您正在使用 MySQL ,但这可以在其他 DBMS上使用

希望这有帮助!

答案 2 :(得分:0)

我找到了解决方案。谢谢你goreSplatter和ajreal和dcestari为你输入并帮助我思考它。这是工作查询:

$query = mysql_query("SELECT SUM(IF(log_date<(CURDATE()-DAYOFMONTH(CURDATE())),1,0)) AS LAST_MONTH, SUM(IF(log_date<DATE_ADD(LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)), INTERVAL 1 DAY),1,0)) AS PREV_MONTH FROM myTable WHERE member_id = '$mid'")or die(mysql_error());

对于PREV_MONTH计算,我回去了两个月,得到了那个月的最后一天,又增加了一天来获得上个月的第一天。似乎如果他们有“LAST_DAY”,他们也会有'FIRST_DAY'功能。

希望这可以帮助有人在路上。