以下是有问题的SQL查询及其产生的结果:
然而,我需要的是按以下方式格式化数据:
Emp No Sign In Sign out
022195 2013-01-29 09:18:00 2013-01-29 19:18:00
043770 2013-01-29 10:07:00 2013-01-29 17:07:00
答案 0 :(得分:1)
您不必为此执行任何子查询,您可以使用基本aggregate functions覆盖表格并按名称分组
select
t.name as EmpNo,
min(t.date) as SignIn,
max(t.date) as SignOut
from text_based_attendance as t
group by t.name
order by t.name
此查询中不需要别名(as t
),但我认为最好为查询添加别名,以便日后轻松修改和添加联接。
对于PostgreSQL,如果您想按日期分组并获得每个日期的最小值和最大值,您可以这样做:
select
t.name as EmpNo,
t::date as Date,
min(t.date) as SignIn,
max(t.date) as SignOut
from text_based_attendance as t
group by t.name, t::date
order by t.name
答案 1 :(得分:1)
您可以使用date()函数聚合MySQL中的日期。诀窍是在group by子句中使用它。
select name,
min(date) as Sign_In,
max(date) as Sign_Out,
from text_based_attendance
group by date(date), name
order by name
这将给出一个结果,通过他们的姓名和他们工作的日期对员工进行分组,仅显示唱歌进/出时间。
这是我的SQLFiddle:http://sqlfiddle.com/#!2/740e2/1
在Orace中,你会对EXTRACT函数做同样的事情:
select name,
min(mdate) as Sign_In,
max(mdate) as Sign_Out
from text_based_attendance
group by EXTRACT(day from mdate),name
http://sqlfiddle.com/#!4/96b6c/1
对于Postgres,它或多或少与Oracle相同。
http://www.postgresql.org/docs/7.4/static/functions-datetime.html
答案 2 :(得分:0)
如果我做得对:
select name,
min(date) as Sign_In,
max(date) as Sign_Out
from text_based_attendance
group by name