我有一个带有last_login列的用户表。这是用户的内容示例:
2014-06-30 14:53:14
我想返回一个活跃用户列表。活跃用户是过去20天内登录的用户。
我的逻辑是:
$twenty_days_ago = strtotime('20 days ago');
last_login > $twenty_days_ago
是否可以将我的last_login字符串转换为sql代码中的unix时间戳?无需返回所有用户并循环遍历数组以检查每个用户行?
类似于:strtotime(last_login) > $twenty_days_ago
谢谢!
答案 0 :(得分:2)
是的,但是......
为了获得良好性能的最佳镜头,我们更喜欢谓词中的裸列,并避免在函数中包装列。 (MySQL不会对包含在函数中的列使用索引范围扫描。
要在last_login
列上启用索引范围扫描,我们更喜欢这种形式的谓词:
WHERE t.last_login > NOW() - INTERVAL 20 DAY
如果您作为参数传入的是整数unix时间戳,那么最好将该文字(一次)转换为与last_login
列的数据类型匹配。 MySQL提供了可以执行此转换的FROM_UNIXTIME()
函数。例如:
WHERE t.last_login > FROM_UNIXTIIME(1402416849)
您的问题的答案是“是”,可以以您询问的形式编写查询。您可以使用UNIX_TIMESTAMP
函数:
WHERE UNIX_TIMESTAMP(t.last_login) > 1402416849
同样,如上所述,这种方法禁用了MySQL使用范围扫描操作的能力。此表单强制MySQL为表中的每一行计算UNIX_TIMESTAMP函数,然后将结果与文字进行比较。
当我们在“文字”方面进行转换时,转换完成一次,我们可以引用谓词中的裸列。
注意:当客户端的时区与服务器的时区不匹配时,也要注意时区转换问题;这种行为可能是出乎意料的,但它的定义很明确。
答案 1 :(得分:1)
听起来我真正需要的是一个基于日期时间列选择的select语句。
SELECT id FROM users WHERE last_login >= NOW() - INTERVAL 20 DAY
OR
尝试本文作为在PHP UNIX时间戳和mySQL时间戳http://www.richardlord.net/blog/dates-in-php-and-mysql之间进行转换的良好起点