时间检查是否时间已晚 [英] Time check if the time is late

查看:73
本文介绍了时间检查是否时间已晚的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

时间检查是否迟到



查看更多:SQL

i有如下数据,需要检查时间来自其他桌子。

三张桌子。

1.EmpShift - > EmpID,ShiftName,Startdate,EndDate

2.ShiftTable - > ShiftName,StartTime,EndTime

3.InOut - > EmpID,InOut,CheckType。



到目前为止我只尝试这个。



隐藏复制代码

Time Check Whether it is late or not

See more: SQL
i have some data like below , need to check the time from other table.
three tables.
1.EmpShift -> EmpID,ShiftName,Startdate,EndDate
2.ShiftTable ->ShiftName,StartTime,EndTime
3.InOut -> EmpID,InOut,CheckType.

So far i try only this.

Hide Copy Code

Select EmpShift.EmpID,EmpShift.ShiftName,EmpShift.StartDate,EmpShift.EndDate,
        CONVERT(VARCHAR(10), InOut.inout, 112) AS WORKDATE, convert(char(5), InOut.inout, 108) As CheckTime,
        InOut.CheckType
  From EmpShift
       Inner Join InOut On
EmpShift.EmpID=InOut.EmpID
Where (StartDate Between '2015-05-01' AND '2015-06-10') AND (EndDate Between '2015-05-01' AND '2015-06-10')
GROUP BY EmpShift.EmpID, CONVERT(VARCHAR(10),InOut.inout, 112),convert(char(5), InOut.inout, 108),EmpShift.EmpID,EmpShift.ShiftName,
EmpShift.StartDate,EmpShift.EndDate,InOut.CheckType



结果是这样的。



隐藏复制代码


result is like this.

Hide Copy Code

191 Evening 2015-05-21  2015-05-29  20150507    19:05   O
191 Morning 2015-05-01  2015-05-20  20150507    19:05   O
191 Morning 2015-05-30  2015-06-07  20150507    19:05   O
191 Evening 2015-05-21  2015-05-29  20150509    11:05   I
191 Morning 2015-05-01  2015-05-20  20150509    11:05   I
191 Morning 2015-05-30  2015-06-07  20150509    11:05   I
191 Evening 2015-05-21  2015-05-29  20150509    15:02   I
191 Morning 2015-05-01  2015-05-20  20150509    15:02   I
191 Morning 2015-05-30  2015-06-07  20150509    15:02   I





我的意思是INO意味着出去我想要得到的是我想用ShiftTable检查时间和输出和每天迟到的分钟数。如何在checktype之后得到这个结果。



I means "IN" O means "Out" what i am trying to get is i want to check the time with ShiftTable and output and how many minutes is the late for each day. how i can get this result in after the checktype.

推荐答案

如果你将原始查询放入公用表表达式(CTE),你可以轻松地将它加入到ShiftTable中例如
If you put your original query into a Common Table Expression (CTE) you can easily join it to your ShiftTable e.g.
;WITH CTE AS
(
	Select EmpShift.EmpID,EmpShift.ShiftName,EmpShift.StartDate,EmpShift.EndDate,
			CONVERT(VARCHAR(10), InOut.inout, 112) AS WORKDATE, convert(char(5), InOut.inout, 108) As CheckTime,
			InOut.CheckType
	  From EmpShift
		   Inner Join InOut On
	EmpShift.EmpID=InOut.EmpID
	Where (StartDate Between '2015-05-01' AND '2015-06-10') AND (EndDate Between '2015-05-01' AND '2015-06-10')
	GROUP BY EmpShift.EmpID, CONVERT(VARCHAR(10),InOut.inout, 112),convert(char(5), InOut.inout, 108),EmpShift.EmpID,EmpShift.ShiftName,
	EmpShift.StartDate,EmpShift.EndDate,InOut.CheckType
)
select * 
from CTE
INNER JOIN ShiftTable ST ON CTE.ShiftName = ST.ShiftName

将把ShiftTable StartTime EndTime 添加到上面的结果中。



您需要做的就是在您的选择中添加一个比较适当的列

which will add the ShiftTable StartTime and EndTime to your results above.

All you need to do then is add a comparison to the appropriate column in your select e.g.

CASE WHEN CTE.CheckType = 'O' THEN
    ABS(DATEDIFF(MINUTE, CTE.CheckTime, ST.EndTime))
ELSE
    ABS(DATEDIFF(MINUTE, CTE.CheckTime, ST.StartTime))
END as TimeDiff,
CASE WHEN CTE.CheckType = 'O' THEN
    CASE WHEN CTE.CheckTime > ST.EndTime THEN 'Worked Late'
         WHEN CTE.CheckTime < ST.EndTime THEN 'Left Early'
         ELSE 'On Time'
    END
ELSE
    CASE WHEN CTE.CheckTime > ST.StartTime THEN 'Arrived Late'
         WHEN CTE.CheckTime < ST.StartTime THEN 'Started Early'
         ELSE 'On Time'
    END
END As EarlyLate


这篇关于时间检查是否时间已晚的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆