sql如何在超时之间获取员工的先入先出

时间:2019-02-22 06:27:40

标签: sql

我试图使用SQL查询来吸引员工。

这就是我想要做的。假设我有这张桌子t:

employee_id | timeinout          
2           | 2019-02-22 02:10:00.000
2           | 2019-02-22 08:30:00.000
2           | 2019-02-22 09:10:00.000
3           | 2019-02-22 08:45:00.000
3           | 2019-02-22 10:30:00.000
3           | 2019-02-22 18:10:00.000

在上午9:16以后,应将早上6点至上午9:15之间的时间视为先入先出。

注意:如您在表格中所看到的,2019年2月22日02:10:00.000的时间不算是先入为主。

我可以通过执行此查询来获得第一个。

select employee_id,min(timeinout) as timein, max(timeinout) as timeout
group by employee_id,cast(timeinout as date)


employee_id | timein                  | timeout
2           | 2019-02-22 02:10:00.000 | 2019-02-22 09:10:00.000
3           | 2019-02-22 08:45:00.000 | 2019-02-22 18:10:00.000

如何获得此结果:

employee_id | timein                  | timeout
2           | 2019-02-22 08:30:00.000 | 2019-02-22 09:10:00.000
3           | 2019-02-22 08:45:00.000 | 2019-02-22 18:10:00.000

3 个答案:

答案 0 :(得分:2)

您需要使用case..when子句进行min聚合。

如果您使用的是MySQL,请尝试对str_to_date使用以下查询:

select employee_id,
       min( case when timeinout >= str_to_date('2019-02-22 06:10:00.000','%Y-%m-%d %h:%i:%s') 
                  and timeinout <  str_to_date('2019-02-22 09:16:00.000','%Y-%m-%d %h:%i:%s') 
                 then timeinout end ) as timein, 
       max(timeinout) as timeout 
  from shift 
 group by employee_id,cast(timeinout as date);

employee_id  timein                  timeout
2            2019-02-22 08:30:00     2019-02-22 09:10:00
3            2019-02-22 08:45:00     2019-02-22 18:10:00

Demo

如果您使用的是SQL Server,请尝试对

使用以下查询

convert( varchar, @val_date_time, 113 )

 select employee_id,
       min( case when timeinout >= convert( varchar, '2019-02-22 06:10:00.000', 113 ) 
                  and timeinout <  convert( varchar, '2019-02-22 09:16:00.000', 113 ) 
            then timeinout end ) as timein, 
        max(timeinout) as timeout 
   from shift
  group by employee_id,cast(timeinout as date);

employee_id  timein                      timeout
2            2019-02-22 08:30:00.000     2019-02-22 09:10:00.000
3            2019-02-22 08:45:00.000     2019-02-22 18:10:00.000

Demo

答案 1 :(得分:0)

您是否找到employee_id和日期分组

select employee_id,min(timeinout) as timein, max(timeinout) as timeout
from table_name group by employee_id,cast(timeinout as date)

您必须转换timeinout的日期,并且必须在group by中使用那个

答案 2 :(得分:0)

根据您的描述,我创建了一个虚拟表。我发现以下查询为您提供了所需的结果。

SELECT employee_id,min(timeinout) as timein, max(timeinout) as timeout FROM `employee` WHERE timeinout > CAST('6:00:00' AS time) group by `employee_id` 

结果是:-

timein                  timeout               employee_id   
2019-02-22 08:30:00     2019-02-22 09:10:00   2
2019-02-22 08:45:00     2019-02-22 18:10:00   3