MySQL — выберите данные, где время совпадает с будущей датой

У меня есть таблица в моей базе данных, называется users_addedвнутри этой таблицы у меня есть поле с именем expire который хранит метку времени Unix.

Мой вопрос, как я могу пройти через Икс количество дней и посмотрите, сколько дней осталось пользователям (до истечения срока действия)

Пример:

    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)));
}

Я действительно не могу идти дальше отсюда, потому что я застрял. Я не знаю, как этого добиться.

3

Решение

Это сработало для меня:

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>

Просто позвольте базе данных сделать работу; вычитая временная метка истечения срока от текущей временной метки дает вам количество секунд до истечения срока действия, а ее деление на 86400 дает вам количество дней. Тогда ты можешь группа результаты по количеству дней, чтобы получить счет за каждый день.

7

Другие решения

Я бы сгенерировал массив возможных дат, используя цикл while, а затем использовал max и min для выполнения запроса MySQL, используя BETWEEN AND
Первая часть будет выглядеть примерно так:

$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. Как бауны, это можно сделать с помощью массива $ expdts, поскольку ключи в этом массиве показывают, сколько «дней» отметки времени от текущей даты.

Я не проверял это прошлое в первой части.

2

По вопросам рекламы [email protected]