我有一个查询,可以获取有关员工时钟时间的数据。此查询还添加了一个名为inDay的字段,按日对行进行分组并为其提供数字。所以我可以对行进行约会以获得正确的工作时间。
SELECT CHINA_VISION_PubPersonnel.Name, CHINA_VISION_PubPersonnel.ID, CHINA_VISION_PubCards.CardCode, CHINA_VISION_PubPersonnel.Telephone, ATDShiftDetail.EndOverDay,
CHINA_VISION_DorEvents.EventTM AS T, CONVERT(VARCHAR(10), CHINA_VISION_DorEvents.EventTM, 102) AS Day, FLOOR(CONVERT(FLOAT,
CHINA_VISION_DorEvents.EventTM)) AS DayNumber,
ROW_NUMBER() OVER(PARTITION BY FLOOR(CONVERT(FLOAT,CHINA_VISION_DorEvents.EventTm)) ORDER BY CHINA_VISION_DorEvents.EventTm) InDay
FROM CHINA_VISION_PubCards INNER JOIN
CHINA_VISION_PubPersonnel ON CHINA_VISION_PubCards.PubPersonnel_Ref = CHINA_VISION_PubPersonnel.Reference INNER JOIN
CHINA_VISION_DorEvents ON CHINA_VISION_PubCards.CardCode = CHINA_VISION_DorEvents.CardCode INNER JOIN
ATDShiftDetail ON RIGHT(CHINA_VISION_PubPersonnel.ID, 4) = ATDShiftDetail.Name
WHERE (CHINA_VISION_DorEvents.DorCtrls_Ref = '16') AND (CHINA_VISION_DorEvents.CardCode = '0042f55c') AND (CONVERT(Date, CHINA_VISION_DorEvents.EventTM)
> DATEADD(day, - 6, GETDATE())) AND ATDShiftDetail.EndOverDay = '1'
示例输出数据。
Name ID CardCode Telephone EndOverDay T Day DayNumber InDay
----------------------------------------------------------------------------------------------
Joe Blogs 1 0042f55c 8 1 2015-11-06 01:17:05.000 2015.11.06 42312 1
Joe Blogs 1 0042f55c 8 1 2015-11-06 01:45:44.000 2015.11.06 42312 2
Joe Blogs 1 0042f55c 8 1 2015-11-06 07:45:56.000 2015.11.06 42312 3
Joe Blogs 1 0042f55c 8 1 2015-11-09 19:39:21.000 2015.11.09 42315 1
Joe Blogs 1 0042f55c 8 1 2015-11-10 01:11:15.000 2015.11.10 42316 1
Joe Blogs 1 0042f55c 8 1 2015-11-10 01:36:39.000 2015.11.10 42316 2
Joe Blogs 1 0042f55c 8 1 2015-11-10 07:57:02.000 2015.11.10 42316 3
Joe Blogs 1 0042f55c 8 1 2015-11-10 19:42:45.000 2015.11.10 42316 4
Joe Blogs 1 0042f55c 8 1 2015-11-11 01:16:07.000 2015.11.11 42317 1
Joe Blogs 1 0042f55c 8 1 2015-11-11 01:40:06.000 2015.11.11 42317 2
Joe Blogs 1 0042f55c 8 1 2015-11-11 07:55:20.000 2015.11.11 42317 3
然而,这名员工在晚上工作,这意味着我需要将前一天的最后一条记录分组,这将是他们接下来的三条记录的时间。
使用上面的输出就是输出应该是什么样的。
一旦数据是我喜欢的方式,我就可以通过Datediff来获取员工的工作时间。
Name ID CardCode Telephone EndOverDay T Day DayNumber InDay
----------------------------------------------------------------------------------------------
Joe Blogs 1 0042f55c 8 1 2015-11-06 01:17:05.000 2015.11.06 42312 1 -- were missing the record from the night before so start at 1 here
Joe Blogs 1 0042f55c 8 1 2015-11-06 01:45:44.000 2015.11.06 42312 2
Joe Blogs 1 0042f55c 8 1 2015-11-06 07:45:56.000 2015.11.06 42312 3
Joe Blogs 1 0042f55c 8 1 2015-11-09 19:39:21.000 2015.11.09 42315 1
Joe Blogs 1 0042f55c 8 1 2015-11-10 01:11:15.000 2015.11.10 42316 2
Joe Blogs 1 0042f55c 8 1 2015-11-10 01:36:39.000 2015.11.10 42316 3
Joe Blogs 1 0042f55c 8 1 2015-11-10 07:57:02.000 2015.11.10 42316 4
Joe Blogs 1 0042f55c 8 1 2015-11-10 19:42:45.000 2015.11.10 42316 1
Joe Blogs 1 0042f55c 8 1 2015-11-11 01:16:07.000 2015.11.11 42317 2
Joe Blogs 1 0042f55c 8 1 2015-11-11 01:40:06.000 2015.11.11 42317 3
Joe Blogs 1 0042f55c 8 1 2015-11-11 07:55:20.000 2015.11.11 42317 4
答案 0 :(得分:1)
您必须有一些方法来判断班次何时开始和结束,或者只是“一天的最后一次始终是班次的开始”?如果有一定的时间,如果他们总是在晚上7点之后进入时间,那么在这种情况下很容易将时间改变5小时来获得天数:
FLOOR(CONVERT(FLOAT, DATEADD(hour, 5, EventTM))) AS DayNumber
答案 1 :(得分:0)
这是一个功能性问题,而不是技术问题......如果日期可能不同,你怎么知道" in"和" out"永远在一起?例如,前四个记录可能意味着emp来自6-11 1:17,离开6-11 1:45,来自6-11 7:45,然后停留三天直到9-11 19:39。
9-11只有一张时间戳;怎么应该被处理?
你需要一个代码,以便将时间戳记在""或者" out",它是确定时钟记录之间的时间跨度的唯一方法。" present"而且#34;缺席"。