2011-06-09 83 views
5

我有一个用户表,其中用户需要被批准,我想显示未被批准并且在7天前以前注册的用户。从MySQL表中选择PHP时间戳比X更早的行

我user_regdate是用PHP time()函数创建一个时间戳。

这是我尝试,它不工作:

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

感谢

充其量
+0

什么'SELECT now() - interval 7 day' return? – 2011-06-09 20:35:04

+0

它返回所有批准= 0的行 – 2by 2011-06-09 20:36:53

+0

否否,只需运行我添加为注释的SELECT查询以返回时间值。它显示了什么价值? – 2011-06-09 20:37:55

回答

14

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

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

基本上,没有unix_timstamp()调用,你比较苹果和桔子。

+0

谢谢,它的作品! :) – 2by 2011-06-09 20:44:44

+0

爱Stackoverflow为此原因...谢谢! – 2016-02-10 17:46:06

3

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

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

谢谢,也有作品:) – 2by 2011-06-09 20:46:12

1

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

尝试使用Unix的时间戳,零下7天,而不是现在()在您的查询:

$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;"); 
0

试试这个;

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

请注意,此查询将强制MySQL执行全表扫描,并因此具有重大的性能影响。请参阅Marc的答案,以获得更易于查询索引。 – 2011-06-10 12:50:09