用于查找人迟到的记录的SQL查询

时间:2018-06-14 17:27:53

标签: c# sql-server windows-forms-designer

我有一个名为Employee的表。在此表中,我有一个员工ID和一个员工姓名。我有另一张名为出勤的表,其中包含员工ID(FK),日期,预计时间,时间和时间状态。我想找到约翰·布朗迟到的所有记录。

这就是表格的样子:

员工表

| emp_id  | emp_name   |
| 1       | John Brown |
| 2       | Bob Marley |
| 3       | Rob West   |

出勤表:

| emp_id  | Date      | expected_time |time_in|time_status|
| 1       | 12-Sep-18 | 8:30          |8:50   |Late       |
| 2       | 12-Sep-18 | 8:30          |8:23   |On-Time    |
| 3       | 12-Sep-18 | 8:30          |8:15   |On-Time    |

结果应如下所示:

| emp_id  | emp_name   | Date       | time_in |
| 1       | John Brown | 12-Sep-18  | 8:50    |
| 1       | John Brown | 17-Sep-18  | 9:00    |
| 1       | John Brown | 27-Sep-18  | 8:47    |

您将如何在SQL查询中表达这一点。另外我如何检查确定迟到的时间,比如说如果通过8:00你被认为迟到了?

4 个答案:

答案 0 :(得分:2)

plain sql:

select 
    e.emp_id, e.emp_name, a.Date, a.time_in
from
  employee e
  join attendance a on e.emp_id = a.emp_id
where 
  a.time_status = 'Late'

假设Late是一个固定的字符串,而不是你随机输入的东西

答案 1 :(得分:1)

SELECT e.emp_id, e.emp_name, Date, time_in
FROM Employee as e inner join Attendance as a
ON e.emp_id = a.emp_id
WHERE a.expected_time < a.time_in
AND emp_name = 'John Brown'

答案 2 :(得分:0)

如果您想根据时间和预期时间指定“延迟”或“开启时间”,则查询将

SELECT 
    e.emp_id, 
    e.emp_name, 
    a.Date, 
    a.time_in,
    (case when a.time_in > a.expected_time then 'Late' else 'On-time') as Time_status
FROM 
    Employee as e, 
    Attendance as a
where 
    e.emp_id = a.emp_id

答案 3 :(得分:0)

这听起来像是在寻找计算列。请注意,我认为time_in在您的实际插入上只是GETDATE()。但在这里,我们使用静态值进行测试。在下面的DDL中,time_status是基于expected timetime_in的计算列。如果time_in大于expected_time,则我们将其标记为延迟,否则他们按时。如果你想给它们一个5分钟的阈值,或者其他什么,你可以使用这个逻辑。

<强> CLICK HERE FOR ONLINE DEMO

create table #EmployeeTable (
                                emp_id int identity (1,1), 
                                emp_name varchar(64)
                             )
go


create table #AttendanceTable (
                                    emp_id int,
                                    [Date] date,
                                    expected_time time,
                                    time_in time,
                                    time_status as cast(case when time_in > expected_time then 'Late' else 'On-Time' end as varchar(64))
                                )
go

insert into #EmployeeTable
values
('John Brown'),
('Bob Marley'),
('Rob West')


insert into #AttendanceTable
values
(1,'20180912','08:30','08:50'),
(2,'20180913','08:30','08:23'),
(3,'20180914','08:30','08:15')


select
    e.emp_name
    ,a.*
from 
    #EmployeeTable e
    inner join
    #AttendanceTable a on a.emp_id = e.emp_id

drop table #AttendanceTable
drop table #EmployeeTable