php - 选择时间与未来日期相同的数据

时间:2014-10-30 18:56:55

标签: php mysql time pdo unix-timestamp

我的数据库中有一个名为users_added的表,在该表中,我有一个名为expire的字段,用于存储unix时间戳。

我的问题是,如何循环 x 天数,并查看用户已离开的天数(到达到期日期)

示例:

    1 day remaining:
    10 users

    2 days remaining: 
    0 users

    3 days remaining 
    50 users

等等。

图形示例:

enter image description here

这是我到目前为止所做的:

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

我无法离开这里,因为我被困住了。我不知道如何实现这一目标。

2 个答案:

答案 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数组来完成,因为此数组中的键是时间戳距当前日期的“天数”。

我在第一部分没有测试过这个。