【问题标题】:php - select data where time is same as future datephp - 选择时间与未来日期相同的数据
【发布时间】:2014-10-30 18:56:54
【问题描述】:

我的数据库中有一个名为 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)));
    }

因为我被困住了,所以我真的不能再进一步了。我不知道如何实现这一点。

【问题讨论】:

  • GROUP BY CEIL( (expire - UNIX_TIMESTAMP()) / 86400)?不过,我通常会避免在表中使用 unix 时间戳。 (您可能需要添加 WHERE expire &gt; UNIX_TIMESTAMP() 以避免过期用户显示负数)。

标签: php mysql time pdo unix-timestamp


【解决方案1】:

这对我有用:

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按天数计算结果,以获取每天的计数。

【讨论】:

    【解决方案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 变量对它们进行排序。这可以通过 $expdts 数组来完成,因为该数组中的键是时间戳从当前日期算起的“天数”。

    在第一部分之后我还没有测试过。

    【讨论】:

    • 使用 SELECT * 查询我没有得到任何结果。
    • 我对其进行了测试,它对我有用,您是否收到任何错误消息?桌子长什么样子?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多