SQL将日期字符串转换为查询中的unix时间戳

时间:2014-06-30 16:13:28

标签: mysql sql timestamp unix-timestamp strtotime

我有一个带有last_login列的用户表。这是用户的内容示例:

2014-06-30 14:53:14

我想返回一个活跃用户列表。活跃用户是过去20天内登录的用户。

我的逻辑是:

  1. 获取20天前的Unix时间戳日期:$twenty_days_ago = strtotime('20 days ago');
  2. 让所有用户last_login > $twenty_days_ago
  3. 是否可以将我的last_login字符串转换为sql代码中的unix时间戳?无需返回所有用户并循环遍历数组以检查每个用户行?

    类似于:strtotime(last_login) > $twenty_days_ago

    谢谢!

2 个答案:

答案 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之间进行转换的良好起点