我有一个MySQL表,记录员工登录和注销时间。在输入输出列1中表示登录,0表示登出。
[id] [User_id] [Date_time] [in_out]
1 1 2011-01-20 09:30:03 1
2 1 2011-01-20 11:30:43 0
3 1 2011-01-20 11:45:12 1
4 1 2011-01-20 12:59:56 0
5 1 2011-01-20 13:33:11 1
6 1 2011-01-20 15:38:16 0
7 1 2011-01-20 15:46:23 1
8 1 2011-01-20 17:42:45 0
是否可以使用单个查询检索用户在一天中工作的总小时数?
我尝试了很多但都徒劳无功。我可以使用数组在PHP中执行此操作,但无法使用单个查询执行此操作。
答案 0 :(得分:5)
SELECT `User_id`, time(sum(`Date_time`*(1-2*`in_out`)))
FROM `whatever_table` GROUP BY `User_id`;
(1-2 *`in_out`)术语为每个登录事件提供-1因子,每个注销事件为+1因子。 sum
函数采用Date_time
列的总和,GROUP BY`User_id`表示创建了每个不同用户的总和。
答案 1 :(得分:4)
鲁迪的思路是正确的。如果你想要小时的小时,请在date_time字段上使用UNIX_TIMESTAMP(),否则返回的类型将是DATETIME(难以解析)。以下是前4行数据的结果,另外还有2天的结果:
SELECT
`user_id`,
DATE(`date_time`) AS `date`,
SUM(UNIX_TIMESTAMP(`date_time`)*(1-2*`in_out`))/3600 AS `hours_worked`
FROM `test`
GROUP BY date(`date_time`), `user_id`;
+---------+------------+--------------+
| user_id | date | hours_worked |
+---------+------------+--------------+
| 1 | 2011-01-20 | 3.2567 |
| 1 | 2011-01-21 | 3.0000 |
+---------+------------+--------------+
答案 2 :(得分:0)
尝试一下:
select [User_id], sum([Time_count])/3600
from (
select [User_id],
case when [in_out]=1 then UNIX_TIMESTAMP([Date_time])
when [in_out]=0 then - UNIX_TIMESTAMP([Date_time])
end as [Time_count]
from my_table
) as a
group by [User_id]
我不知道MySQL的语法,所以如果有人发现错误,请更正它们。
也许无法奏效。例如,如果您有用户登录。在这种情况下,您只能过滤[in_out]
字段中具有相同数字1和0的用户。