我有一个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
答案 0 :(得分:0)
您可以使用FROM_UNIXTIME
和DATE_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;