使用PHP在过去12个月中计算所有SQL的SQL

时间:2017-03-01 20:01:55

标签: php mysql date count timestamp

我有一个MySQL / MariaDB数据库,其中包含使用PHP函数date()创建的时间戳。

像这样:

ID | Name | Date
--------------------------
12 | John | 123456789
13 | Mike | 987654321
...
29 | Rick | 123498765
30 | Adam | 987651234

现在我需要获取自当前人数以来过去12个月内每月所有人的统计数。

示例:

目前是三月,所以我需要得到这样的东西:

March has 3 persons
February has 14 persons
January has 16 persons
December has 13
November has 16
October has 30
...

继续。

如何使用PHP执行此操作?

到目前为止,我有一个简单的for循环,它返回最后12个月,然后是每个循环的时间戳,但我真的不知道如何比较返回的时间戳和DB时间戳。

for ($number = 0; $number <= 11; $number++) {
    $month = strtotime("-".$number." month");

    echo "Timestamp: ".$month."<br>";
    echo "Month: ".date("F", $month);
    echo "<hr>";
};

该循环返回如下内容:

Timestamp: 1488398035
Month: March
---
Timestamp: 1485978835
Month: February
---
Timestamp: 1483300435
Month: January
---
Timestamp: 1480622035
Month: December
---
Timestamp: 1478026435
Month: November
---
Timestamp: 1475348035
Month: October
---
Timestamp: 1472756035
Month: September
---
Timestamp: 1470077635
Month: August
---
Timestamp: 1467399235
Month: July
---
Timestamp: 1464807235
Month: June
---
Timestamp: 1462128835
Month: May
---
Timestamp: 1459536835
Month: April

4 个答案:

答案 0 :(得分:0)

您可以使用FROM_UNIXTIMEDATE_FORMAT函数将时间戳分别转换为字符串中的日期和日期,并获取计数,例如:

SELECT DATE_FORMAT(FROM_UNIXTIME(`date`), '%Y-%m') as `month`, COUNT(ID) as count
FROM table
GROUP BY `month`;

答案 1 :(得分:0)

您可以在MySQL中执行此操作,只需将table_name替换为表的实际名称:

SELECT
    YEAR(FROM_UNIXTIME(`Date`)),
    MONTH(FROM_UNIXTIME(`Date`)),
    count(*) as total
FROM table_name
WHERE `Date` > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 12 month))
GROUP BY YEAR(FROM_UNIXTIME(`Date`)), MONTH(FROM_UNIXTIME(`Date`))

通常,如果您使用日期时间列,则此概念更有效(特别是一旦您拥有大量数据)。这会有效。这个查询也假定在12个月前字面上,直到当天,你可以计算出该月第一天的确切时间戳等等......再次,这将更容易,更有效率的日期时间列。

答案 2 :(得分:0)

要返回十二行,一个用于当前月份,十一个用于前几个月,以及一个计数(即使计数为零),我们可以执行以下操作:

SELECT CONCAT(DATE_FORMAT(r.sd,'%M is ')
             ,COUNT(t.name)
             ,' person'
             ,IF(COUNT(t.name)=1,'','s')
       ) AS `something_like_this`
  FROM ( SELECT d.d - INTERVAL i.i - 0 MONTH AS sd
              , d.d - INTERVAL i.i - 1 MONTH AS ed
           FROM ( SELECT DATE_FORMAT(NOW(),'%Y-%m-01') AS d ) d
          CROSS
           JOIN ( SELECT 0 AS i UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
                  UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 
                  UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
                  UNION ALL SELECT 10 UNION ALL SELECT 11
                ) i
          ORDER BY sd DESC
       ) r        
 LEFT
 JOIN mytable t
   ON t.date >= UNIX_TIMESTAMP(r.sd)
  AND t.date <  UNIX_TIMESTAMP(r.ed)
GROUP BY r.sd
ORDER BY r.sd DESC

内联视图r旨在返回12行。在这些行上,我们返回句点的开始和结束日期。在这种情况下,该月的第一天和下个月的第一天。

我们想要获取行数的表的外部联接。鉴于date列存储为unix样式的32位整数(自纪元以来的秒数),我们可以使用MySQL UNIX_TIMESTAMP函数转换MySQL DATE值(来自r) ,所以我们有可以比较的价值。

要回答被问到的问题,是的,也可以在PHP中实现这种类型的功能。

使用生成该期间“开始”时间戳的当前代码,还会生成“结束”时间戳(下个月的第一个)。

然后执行获取计数的查询。

  SELECT COUNT(t.name) AS cnt
    FROM mytable t
   WHERE t.date >= 1488326400    /* 2017-03-01 00:00 UTC */
     AND t.date <  1491004800    /* 2017-04-01 00:00 UTC */

获取结果,然后输出一行。对于上个月,请运行另一个查询

  SELECT COUNT(t.name) cnt
    FROM mytable t
   WHERE t.date >= 1485907200    /* 2017-02-01 00:00 UTC */
     AND t.date <  1488326400    /* 2017-03-01 00:00 UTC */

获取结果,输出一行。并重复一遍。

答案 3 :(得分:0)

试试这个

SELECT
YEAR(FROM_UNIXTIME(`Date`)),
MONTH(FROM_UNIXTIME(`Date`)),
count(*) as total
FROM table_name
WHERE date(from_unixtime(`Date`)) 
BETWEEN CURDATE() AND CURDATE() + INTERVAL 12 MONTH;