这是有问题的 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
这是有问题的 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
您不必为此执行任何子查询,您可以使用表上的基本聚合函数并按名称分组
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
您可以使用 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
如果我做对了:
select name,
min(date) as Sign_In,
max(date) as Sign_Out
from text_based_attendance
group by name