php - Merge two rows with different date but with the same attributes -
i have query
select te.user_name, left(te.entry_datetime, 10) entry_date, cin.entry_datetime timein, cout.entry_datetime timeout time_entries te left join (select user_name, left(entry_datetime, 10) entry_date, min(entry_datetime) entry_datetime time_entries entry_type = 'time in' group user_name, entry_date ) cin on cin.user_name = te.user_name , cin.entry_date = left(te.entry_datetime, 10) left join (select user_name, left(entry_datetime, 10) entry_date, max(entry_datetime) entry_datetime time_entries entry_type = 'time out' group user_name, entry_date ) cout on cout.user_name = te.user_name , cout.entry_date = left(te.entry_datetime, 10) group te.user_name, entry_date;
this output sqlfiddle
user_name| entry_date | timein | timeout user1 | 28-jul-13 | 16:40:40 | 16:42:30 user2 | 28-jul-13 | 16:41:13 | 16:41:15
but found loop hole in solution, employees works overnight , time-out following day. when user let time-in on july, 28 2013 , time-out on july, 29 2013 going output. sqlfiddle
user_name| entry_date | timein | timeout user1 | 28-jul-13 | 16:40:40 | null user1 | 29-jul-13 | null | 16:42:30 user2 | 28-jul-13 | 16:41:13 | 16:41:15
the logic right seems not appriate in case. i'm thinking make job easier remove entry_date , have 3 columns user_name, timein , timeout. this.
user_name | timein | timeout user1 | 28-jul-13 16:40:40 | 29-jul-13 16:42:30 user2 | 28-jul-13 16:41:13 | 28-jul-13 16:41:15
could me figure out going change or suggest new solution? thanks.
ok able solved own problem. here solution found newbie sqlfiddle
select te.user_name, date(te.entry_datetime) date, te3.entry_datetime timein, te2.entry_datetime timeout time_entries te join time_entries te3 on te.user_name = te3.user_name , te3.entry_type='time in' , te3.entry_datetime = (select entry_datetime time_entries entry_type='time in' , user_name=te.user_name , entry_datetime = te.entry_datetime group entry_datetime) left join time_entries te2 on te.user_name = te2.user_name , te2.entry_type='time out' , te2.entry_datetime = (select entry_datetime time_entries entry_type='time out' , user_name=te.user_name , entry_datetime > te.entry_datetime order abs(timestampdiff(second, te.entry_datetime, 'entry_datetime')) limit 1)
sample output:
user_name| date | timein | timeout user1 | 28-jul-13 | 28-jul-13 16:40:40 | 29-jul-13 16:42:30 user2 | 29-jul-13 | 29-jul-13 16:43:16 | null user1 | 30-jul-13 | 30-jul-13 16:47:16 | 31-jul-13 16:50:32
btw decided not remove date anymore because found useful.
note: may not best answer nor best design or architecture best can newbie in sql. if have better solution please share , not bark around thanks. :)
Comments
Post a Comment