打卡记录根据排班表每人每日排班上下班时间自动获取结果打卡记录是属于那是区间

在这里插入图片描述 目前有1张打卡记录表,1张排班表,效果要打卡记录根据排班表每人每日排班上下班时间自动获取结果打卡记录是属于那是区间的!效果图 在这里插入图片描述
目前问题点:1.视图写法把区间时间写死,没法根据排班信息进行打卡数据分类
求打卡记录表根据排班信息进行打卡数据分类的视图写法,或其它思路可以达到该效果
A.打卡记录表结构 在这里插入图片描述
B.排班信息表结构 在这里插入图片描述
可以关联字段是员工ID 日期

C.目前视图写法如下:
SELECT
REPLACE(LTRIM(DATEDIFF(DAY,‘1899-12-30’, T.刷卡日期))+’.0’+ LTRIM(T4.BADGENUMBER),’ ‘,’’) AS [考勤识别码],
T.USERID AS [员工考勤机上ID],
T4.BADGENUMBER AS [考勤号码],
T.刷卡日期,
ISNULL(T1.白班上午上班, ‘’) AS [白班上午上班],
ISNULL(T6.白班上午下班, ‘’) AS [白班上午下班],
ISNULL(T7.白班下午上班, ‘’) AS [白班下午上班],
ISNULL(T2.白班下午下班, ‘’) AS [白班下午下班],
ISNULL(T3.白班晚上上班, ‘’) AS [白班晚上上班],
ISNULL(T5.白班晚上下班, ‘’) AS [白班晚上下班],
ISNULL(T10.夜班上午上班, ‘’) AS [夜班上午上班],
ISNULL(T11.夜班上午下班, ‘’) AS [夜班上午下班],
ISNULL(T8.夜班晚上上班, ‘’) AS [夜班晚上上班],
ISNULL(T9.夜班晚上下班, ‘’) AS [夜班晚上下班]

FROM
(SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期
FROM dbo.CHECKINOUT
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MIN(CONVERT(TIME, CHECKTIME, 114)) AS 白班上午上班
FROM dbo.CHECKINOUT AS CHECKINOUT_3
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) < ‘09:00:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T1 ON T1.USERID= T.USERID AND T1.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 白班上午下班
FROM dbo.CHECKINOUT AS CHECKINOUT_3
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘09:00:00’) AND (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) < ‘12:45:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T6 ON T6.USERID= T.USERID AND T6.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 白班下午上班
FROM dbo.CHECKINOUT AS CHECKINOUT_3
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘12:45:00’) AND (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) < ‘14:30:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T7 ON T7.USERID= T.USERID AND T7.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 白班下午下班
FROM dbo.CHECKINOUT AS CHECKINOUT_2
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘14:30:00’) AND (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) < ‘18:30:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T2 ON T2.USERID= T.USERID AND T2.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 白班晚上上班
FROM dbo.CHECKINOUT AS CHECKINOUT_1
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘18:30:00’) AND (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) < ‘18:30:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T3 ON T3.USERID= T.USERID AND T3.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 白班晚上下班
FROM dbo.CHECKINOUT AS CHECKINOUT_1
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘18:30:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T5 ON T5.USERID= T.USERID AND T5.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 夜班晚上上班
FROM dbo.CHECKINOUT AS CHECKINOUT_1
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘16:45:00’) AND (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) < ‘21:00:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T8 ON T8.USERID= T.USERID AND T8.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 夜班晚上下班
FROM dbo.CHECKINOUT AS CHECKINOUT_1
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘21:00:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T9 ON T9.USERID= T.USERID AND T9.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 夜班上午上班
FROM dbo.CHECKINOUT AS CHECKINOUT_1
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘00:00:01’) AND (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) < ‘02:00:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T10 ON T10.USERID= T.USERID AND T10.刷卡日期= T.刷卡日期
LEFT OUTER JOIN (SELECT USERID, CONVERT(varchar(10), CHECKTIME, 120) AS 刷卡日期, MAX(CONVERT(TIME, CHECKTIME, 14)) AS 夜班上午下班
FROM dbo.CHECKINOUT AS CHECKINOUT_1
WHERE (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) >= ‘02:00:00’) AND (CAST(CONVERT(varchar(8), CHECKTIME, 14) AS time) < ‘10:00:00’)
GROUP BY USERID, CONVERT(varchar(10), CHECKTIME, 120)) AS T11 ON T11.USERID= T.USERID AND T11.刷卡日期= T.刷卡日期
LEFT OUTER JOIN dbo.USERINFO AS T4 ON T4.USERID = T.USERID
WHERE
T4.BADGENUMBER IS NOT NULL

猜你喜欢

转载自blog.csdn.net/weixin_37897505/article/details/88692332