MySQL将多个日期列合并为一个

时间:2011-09-26 20:20:39

标签: mysql datetime merge concat

好的,所以我有多个日期时间列,例如date_created,last_login,last_updated等...我想将它们合并到一个列中,并显示最新的日期时间,以便我可以更轻松地跟踪active_users。

我发现了一些使用CONCAT命令的建议,但这看起来只是将所有结果串在一起。

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT username, 
       GREATEST(date_created, last_login, last_updated) last_activity
FROM your_table
ORDER BY last_activity DESC

已编辑:

SELECT username, 
       GREATEST(
           IFNULL(date_created, 0), 
           IFNULL(last_login, 0), 
           IFNULL(last_updated, 0) 
       last_activity
FROM your_table
ORDER BY last_activity DESC

再次编辑:
在您的数据库副本(有27.451条记录)上我使用了:

SELECT id, 
       GREATEST(
           IFNULL(current_login_datetime, 0), 
           IFNULL(created_datetime, 0), 
           IFNULL(updated_datetime, 0)) 
       last_activity
FROM users
ORDER BY last_activity DESC

获得exaclty 27.451记录!!
要证明,请运行此查询:

SELECT COUNT(*) FROM
(SELECT id, 
       GREATEST(
           IFNULL(current_login_datetime, 0), 
           IFNULL(created_datetime, 0), 
           IFNULL(updated_datetime, 0)) 
       last_activity
FROM users
ORDER BY last_activity DESC) der

并检查返回的号码是否与查询相同

SELECT COUNT(*) FROM users

您的问题可能来自总回报或显示记录的限制 例如,使用Navicat灯可以有1000条记录(但总共可以读取27.451)。

答案 1 :(得分:0)

如果值可以为null,并且您想要选择第一个非null值,请使用COALESCE。 GREATESTLEAST也是选项

SELECT 
  username
  ,COALESCE(last_updated,last_login,date_created) AS not_null
  ,GREATEST(date_created, last_login, last_updated) AS latest
  ,LEAST(date_created, last_login, last_updated) AS first
FROM table1
ORDER BY last_activity DESC

如果您想要更多控制,可以使用CASE WHEN语句:

SELECT
  username
  , CASE WHEN date_created > '2011-01-31' THEN date_created
         WHEN last_login > '2011-01-31' THEN last_login
         ELSE last_updated END as its_complicated
.....

如果您想要最新的并且您有null个值,请使用此查询:

SELECT 
  username
  ,GREATEST(IFNULL(date_created,0), IFNULL(last_login,0), IFNULL(last_updated,0)) AS latest
FROM table1
ORDER BY last_activity DESC
相关问题