MySql查询检查两个日期之间每天发生的事件?

时间:2012-02-27 07:55:03

标签: mysql

这是MYSQL表架构:

+---------------+---------------------+
| username      | last_activity_time  |
+---------------+---------------------+
| raphael       | 2011-11-28 23:16:34 |
| donatello     | 2011-11-28 23:17:36 |
| michaelengelo | 2011-11-29 10:08:28 |
| raphael       | 2011-11-29 11:11:33 |
| leonardo      | 2011-11-29 11:12:30 |
+---------------+---------------------+

为每个活动插入一个包含用户名和last_activity_time的新记录。

查询要求:

选择在两个日期之间每天进行一些活动的所有用户,例如2011-11-20和2011-11-30(均包括在内)

“IN”查询似乎不是一个选项,因为它适用于IN数组中的任何值,而不是ALL。

4 个答案:

答案 0 :(得分:1)

SELECT username, COUNT(*) AS nbr_day
FROM (
    SELECT username, DATE(last_activity_time) AS last_activity_date
    FROM my_table
    WHERE ( last_activity_time >= @date1 )
    AND ( last_activity_time < DATE_ADD( @date2, INTERVAL 1 DAY) )
    GROUP BY username, last_activity_date
) AS sub
GROUP BY username
HAVING ( COUNT(*) = 1 + DATEDIFF(@date2, @date1) )

此查询计算每个用户名的不同天数。然后只保留这个数字等于两个日期之间天数的那些。

表达式“DATE_ADD(@ date2,INTERVAL 1 DAY)”表示@ date2之后的日期。它使用的是而不是@ date2,因为“last_activity_time”包含日期和时间。

答案 1 :(得分:0)

尝试使用BETWEEN获取两个日期之间的数据。

SELECT username, mast_activity_time FROM table 
WHERE last_activity_time BETWEEN "2011-11-20 00:00:00" AND "2011-11-30 23:59:59"
GROUP BY username, last_activity_time HAVING COUNT(last_activity_time) = 1

请注意,只有为每个新活动插入新条目时,此查询才有效。如果您只是更新表格中的条目,则无法检索您想要的内容,因为您之前的数据将从表格中删除。

要更好地理解,请检查HAVING

答案 2 :(得分:0)

如果您没有任何高级查询,则可以使用BETWEEN。 (链接:here

并且你可以这样做:

SELECT username,last_activity_time FROM users WHERE last_activity_time BETWEEN 'date1' AND 'date2';

答案 3 :(得分:0)

尝试此查询

SELECT count(distinct date(last_activity_date)),username 
FROM users 
WHERE last_activity_date between start_Date and end_Date 
group by user_id;

如果计数等于日期差异, 他们在两天之内每天至少登录一次