我的数据库中有一个名为users_added
的表,在该表中,我有一个名为expire
的字段,用于存储unix时间戳。
我的问题是,如何循环 x 天数,并查看用户已离开的天数(到达到期日期)
示例:
1 day remaining:
10 users
2 days remaining:
0 users
3 days remaining
50 users
等等。
图形示例:
这是我到目前为止所做的:
// Start date
$date = date("Y-m-d",$time);
// End date
$end_date = date('Y-m-d', strtotime($date . " +10 days"));
while (strtotime($date) <= strtotime($end_date)){
$stmt = $dbh->prepare("SELECT * FROM users_added WHERE user_by=:user AND expire<:time");
$stmt->bindParam(":user",$userdata['username']);
$stmt->bindParam(":time",$end_date);
$stmt->execute();
$expireData = $stmt->fetchAll();
$remaining = $date-$end_date;
echo "$remaining";
echo "day(s) remaining:";
$date = date ("Y-m-d", strtotime("+1 day", strtotime($date)));
}
我无法离开这里,因为我被困住了。我不知道如何实现这一目标。
答案 0 :(得分:7)
这对我有用:
mysql> CREATE TABLE users (expiry INT UNSIGNED);
Query OK, 0 rows affected (0.12 sec)
mysql> INSERT INTO users (expiry) VALUES
(UNIX_TIMESTAMP() + 1000),
(UNIX_TIMESTAMP() + 12348),
(UNIX_TIMESTAMP() + 89284),
(UNIX_TIMESTAMP() + 99438),
(UNIX_TIMESTAMP() + 333552),
(UNIX_TIMESTAMP() + 883718),
(UNIX_TIMESTAMP() + 994872);
Query OK, 7 rows affected (0.05 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> SELECT
ROUND((expiry - UNIX_TIMESTAMP()) / 86400) AS days,
COUNT(*) AS cnt
FROM users
WHERE expiry > UNIX_TIMESTAMP()
GROUP BY days;
+------+-----+
| days | cnt |
+------+-----+
| 0 | 2 |
| 1 | 2 |
| 4 | 1 |
| 10 | 1 |
| 12 | 1 |
+------+-----+
5 rows in set (0.00 sec)
mysql>
让数据库完成工作; subtracting来自当前时间戳的到期时间戳给出了到期前的秒数,除以86400给出了天数。然后,您可以按天数group计算结果,以获取每天的计数。
答案 1 :(得分:2)
我会使用while循环生成一个可能的日期数组,然后使用max和min使用BETWEEN AND运行MySQL查询 第一部分看起来像:
$date = date("Y-m-d");
$expdts = array();
$i = 0;
while($i<=10){
$expdts[] = strtotime($date . " + " . $i . "days");
$i++;
}
然后只运行一个MySQl查询:
"SELECT * FROM users_added WHERE expire BETWEEN :time1 AND :time2"
:time1
为$expdts[0]
且:time2
为$expdts[10]
然后按expire变量对它们进行排序。作为bouns,可以使用$ expdts数组来完成,因为此数组中的键是时间戳距当前日期的“天数”。
我在第一部分没有测试过这个。