0

这是有问题的 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
4

3 回答 3

1

您不必为此执行任何子查询,您可以使用表上的基本聚合函数并按名称分组

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
于 2013-08-16T06:59:26.543 回答
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

于 2013-08-16T07:26:42.163 回答
0

如果我做对了:

select name, 
       min(date) as Sign_In,
       max(date) as Sign_Out
from text_based_attendance 
group by name
于 2013-08-16T06:58:53.873 回答