【问题标题】:Select rows from MySQL table where PHP timestamp is older than X从 MySQL 表中选择 PHP 时间戳早于 X 的行
【发布时间】:2011-09-12 00:51:46
【问题描述】:

我有一个用户表,需要批准用户,我想显示未批准且注册时间超过 7 天的用户。

我的 user_regdate 是使用 php time() 函数创建的时间戳。

这是我尝试的,它不起作用:

mysql_query("select * from users WHERE user_regdate < now() - interval 7 day AND approved='0' order by id;");

谢谢

【问题讨论】:

  • SELECT now() - interval 7 day 返回什么?
  • 返回所有已批准=0的行
  • 不不,只需运行我作为注释添加的 SELECT 查询...返回时间值。它表现出什么价值?

标签: php mysql timestamp


【解决方案1】:

试试这个;

select * 
from users 
WHERE DATE_SUB(user_regdate,INTERVAL 7 DAY) 
AND approved='0' 
order by id;

【讨论】:

  • 请注意,此查询将强制 MySQL 进行全表扫描,因此会对性能产生重大影响。有关索引更友好的查询,请参阅 Marc 的答案。
【解决方案2】:

php 的 time() 函数输出一个 unix 时间戳(自 1970 年 1 月 1 日以来的秒数)。 MySQL 的 now() 函数输出一个格式化的日期(比如 2011-6-9 12:45:34)......所以我认为你不能这样比较它们。

尝试在查询中使用 unix 时间戳,减去 7 天,而不是 now():

 $7_days_ago = time() - (7 * 24 * 60 * 60);
 mysql_query("select * from users WHERE user_regdate <" . $7_days_ago . " AND approved='0' order by id;");

【讨论】:

    【解决方案3】:

    PHP 的 timstamps 是一个简单的整数,而 MySQL 的 now() 返回一个日期时间值。这很可能会修复查询:

    SELECT ... WHERE user_regdate < unix_timestamp(now() - interval 7 day)) ...
    

    基本上,如果没有 unix_timstamp() 调用,您就是在比较苹果和橙子。

    【讨论】:

      【解决方案4】:

      最好的原始解决方案,但在 MySQL 时间计算方面我不是最好的

      $timestamp = strtotime("-7 days");
      mysql_query("SELECT * FROM users WHERE user_regdate < $timestamp AND approved = 0 ORDER BY id");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-16
        • 2015-08-16
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        相关资源
        最近更新 更多