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

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

css - Firefox for ubuntu renders wrong colors -