我必须为我的营销团队提取一份关于我们销售人员完成的现场工作的报告,每个销售人员都将有签到时间和签到时间,以了解他在商店上花费了多少。同样,我需要比较checkout_time和check_time并获取这两条记录之间的时间差。
这是我的示例表:
S.No User_ID Name Check_in_Time Check_out_Time
1 123 XYZ 2019-04-11 09:00:00 2019-04-11 09:15:00
2 123 XYZ 2019-04-11 09:20:00 2019-04-11 09:30:00
3 123 XYZ 2019-04-11 10:00:00 2019-04-11 10:15:00
4 123 XYZ 2019-04-11 11:00:00 2019-04-11 11:30:00
5 567 ZZZ 2019-04-11 10:00:00 2019-04-11 10:30:00
6 567 ZZZ 2019-04-11 11:00:00 2019-04-11 11:30:00
现在,我需要将第一个Check_out_Time与第二个Check_in_Time与时差进行比较,同样,我需要比较给定日期下每个用户的所有check_out和check_in时间差。
请帮助编写MySQL查询。
答案 0 :(得分:0)
您可以将以下解决方案用于MySQL 8.0早期版本(不支持ROW_NUMBER
):
SELECT
t1.User_Id,
t1.Name,
t1.check_out_time,
t2.Name,
t2.Check_in_time,
TIMEDIFF(t2.Check_in_time, t1.check_out_time) AS diff
FROM (
SELECT *, IF(@prev <> User_ID, @rn:=0, @rn), @prev:=User_ID, @rn:=@rn+1 AS rn
FROM table_name JOIN (SELECT @prev:='') init_prev JOIN (SELECT @rn:=0) init_rn
ORDER BY User_ID, Check_in_Time, Check_out_Time
)t1 INNER JOIN (
SELECT *, IF(@prev <> User_ID, @rn:=0, @rn), @prev:=User_ID, @rn:=@rn+1 AS rn
FROM table_name JOIN (SELECT @prev:='') init_prev JOIN (SELECT @rn:=0) init_rn
ORDER BY User_ID, Check_in_Time, Check_out_Time
)t2 ON t1.User_ID = t2.User_ID AND t1.rn + 1 = t2.rn
WHERE DATE(t2.Check_in_time) = '2019-04-11' AND DATE(t1.check_out_time) = '2019-04-11'
从MySQL 8.0开始,您可以使用ROW_NUMBER
使用以下解决方案:
SELECT
t1.User_Id,
t1.Name,
t1.check_out_time,
t2.Name,
t2.Check_in_time,
TIMEDIFF(t2.Check_in_time, t1.check_out_time) AS diff
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY User_ID ORDER BY User_ID, Check_in_Time, Check_out_Time) rn
FROM table_name
)t1 INNER JOIN (
SELECT *, ROW_NUMBER() OVER (PARTITION BY User_ID ORDER BY User_ID, Check_in_Time, Check_out_Time) rn
FROM table_name
)t2 ON t1.User_ID = t2.User_ID AND t1.rn + 1 = t2.rn
WHERE DATE(t2.Check_in_time) = '2019-04-11' AND DATE(t1.check_out_time) = '2019-04-11'
答案 1 :(得分:0)
如果您未使用mysql 8.0版,则可以采用以下解决方法,
SELECT
t1.User_Id,
t1.Name,
t1.check_out_time,
t2.Name,
t2.Check_in_time,
TIMEDIFF(t2.Check_in_time, t1.check_out_time) AS diff
FROM (
SELECT *, @row := @row+1 as rank
FROM table_name, (select @row :=0)
ORDER BY User_ID,Check_in_time
)t1 INNER JOIN (
SELECT *, , @row1 := @row1+1 as rank
FROM table_name, (select @row1 :=0)
ORDER BY User_ID,Check_in_time
)t2 ON t1.User_ID = t2.User_ID AND t1.rank + 1 = t2.rank
WHERE DATE(t2.Check_in_time) = '2019-04-11' AND DATE(t1.check_out_time) = '2019-04-11'