将多天分组在一起

时间:2015-11-11 08:42:41

标签: sql sql-server

我有一个查询,可以获取有关员工时钟时间的数据。此查询还添加了一个名为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

2 个答案:

答案 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;缺席"。