MySQL查询在另一个表中的多个日期之间

时间:2011-04-12 01:56:22

标签: mysql

感觉这应该是我想念的容易的东西。我有一个表,一天有多个时间戳,另一个表有日期范围。我希望在第一个表中选择时间戳在另一个表中的任何日期范围内,特定日期......任何人都知道如何工作或者是否可能?

修改

SELECT count(*) FROM Completed /* Returns 59 */

SELECT count(u.user_id) AS Total FROM Completed c
LEFT JOIN users u ON c.user_id = u.user_id
LEFT JOIN logins l ON c.user_id = l.user_id
WHERE c.start BETWEEN l.signIn AND l.signOut
AND c.users_id = 1400
GROUP BY c.type, c.user_id
ORDER BY c.type, Total /* Returns 57 Total */

所以,我的三张桌子是:

  • 用户。 user_id int,fullname varchar。
  • 完整。 user_id int,type varchar,start datetime
  • 登录。 user_id int,signIn datetime,signOut datetime

Essentialy我在整个表格中有多行,我想知道用户做了多少,以及他们有多少机会去做。 “有机会”只是简单地登录,所以我试图得出每个用户总工作量的细分,而不是可用于他们登录时进来的任何工作。事情是他们将有多个登录一天的时间。我以为我在上面,但没有雪茄。

编辑2

好的,这是表格的样子。在下面的例子中,我想看到John有机会工作4并且工作了2个。我不想算complete_id 4,因为他还没有上班。我理想的结果看起来像是:

name | type | available | worked | sign in             | sign out
Jack | SUV  | 1         |      1 | 2011-04-08 12:30:00 | 2011-04-08 13:00:00 
Jack | SUV  | 3         |      0 | 2011-04-08 13:30:00 | 2011-04-08 14:00:00 // Had An Opportunity to work, but didn't work any
Jack | SUV  | 5         |      2 | 2011-04-08 14:30:00 | 2011-04-08 15:00:00  // Worked two 

用户表

user_id | fullname
1400    | Jack
1401    | John

完整的表格

complete_id | user_id | type | start
1           | 1400    | Car  | 2011-04-08 18:36:22
2           | 1400    | Boat | 2011-04-08 12:31:42
3           | 1401    | SUV  | 2011-04-08 11:14:12
4           | 1400    | Car  | 2011-04-08 1:56:52
5           | 1401    | Car  | 2011-04-08 16:11:23

登录表

login_id | user_id | signIn             | signOut 
1        | 1400    | 2011-04-08 1:00:00 | 2011-04-08 21:00:00 
1        | 1401    | 2011-04-08 11:00:00 | 2011-04-08 21:00:00 

2 个答案:

答案 0 :(得分:2)

select a.*
from tbl a
where exists (
    select *
    from tblother b
    where b.startdate <= a.datecolumn
      and b.enddate   >= a.datecolumn)

答案 1 :(得分:1)

以下SQL应该可以帮助您获取所需的计数。唯一缺少的是完成的工作类型。只有在已完成的表中使用它会使事情变得复杂,但我确信它可以通过更多的思考来实现。

这里的基本思想是我们正在构建一个完整的数据集并汇总我们需要的计数。在日期范围内工作时,我经常使用这种方法。它通常也非常有效。

SELECT Users.Name, Users.SignIn, Users.SignOut,
SUM(CASE WHEN Complete.Start BETWEEN Users.SignIn AND Users.SignOut THEN 1 Else 0) as Available,
SUM(CASE WHEN Complete.Start BETWEEN Users.SignIn AND Users.SignOut AND Users.User_Id = Complete.User_Id THEN 1 ELSE 0) as Worked
FROM Users inner join logins on users.user_id = logins.user_id, Complete
GROUP BY Users.Name, Users.SignIn, Users.SignOut

您可能希望添加WHERE语句来限制查询的日期范围(和行数),包括完整和登录表。