如何在日期内使用GROUP BY关键字查询数据

时间:2013-08-16 06:42:17

标签: sql oracle postgresql

以下是有问题的SQL查询及其产生的结果: enter image description here

然而,我需要的是按以下方式格式化数据:

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

3 个答案:

答案 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