一夜之间转移

时间:2016-07-05 19:09:04

标签: tsql sql-server-2008-r2

我有3台机器的输出数据用于制造。输出如下:

ID      MachineId   ProgramNo               StartTime       StopTime        Cycle   Idle
327628  3           W5_2020_OPP2.MPF        12/15/15 23:29  12/15/15 23:29  0:00:00 0:00:04
327629  3           W5_2020_OPP2.MPF        12/15/15 23:30  12/15/15 23:39  0:09:25 0:01:02
327632  1           880995_610_DN_BOTH.MPF  12/15/15 23:40  12/16/15 0:37   0:56:40 0:10:31
327633  3           W5_2020_OPP2.MPF        12/15/15 23:40  12/15/15 23:40  0:00:08 0:37:35
327634  2           3620_06_OPP1.MPF        12/15/15 23:58  12/16/15 0:07   0:09:08 0:04:38
327635  2           3620_06_OPP1.MPF        12/16/15 0:11   12/16/15 0:14   0:02:32 0:03:05
327636  2           3620_06_OPP1.MPF        12/16/15 0:17   12/16/15 0:34   0:17:08 0:00:41
327637  3           W5_2020_OPP2.MPF        12/16/15 0:18   12/16/15 0:18   0:00:00 0:00:00
327638  3           W5_2020_OPP2.MPF        12/16/15 0:18   12/16/15 0:33   0:15:41 0:02:42
327639  2           3620_06_OPP1.MPF        12/16/15 0:35   12/16/15 0:52   0:16:47 0:09:26
327640  3           W5_2020_OPP2.MPF        12/16/15 0:36   12/16/15 0:36   0:00:00 0:00:06
327641  3           W5_2020_OPP2.MPF        12/16/15 0:36   12/16/15 0:52   0:15:40 0:27:57
327645  1           880995_610_DN_BOTH.MPF  12/16/15 0:47   12/16/15 1:44   0:56:42 0:02:03

我们有2班,运行这些机器,早上6点 - 下午4点和下午4点30分 - 凌晨2:30。我需要将每个班次的循环时间总计在程序编号和机器编号上。我可以很容易地将1班变为总数,是我遇到麻烦的隔夜班次。我想过要把第二班分成两组,午夜之前和午夜之后,但有些情况下程序将在午夜之前开始并在之后结束。或者更容易在不使用列循环的情况下总结启动和停止时间之间的差异?有没有人有什么建议?提前谢谢。

修改

我还没有尝试做总计,主要是专注于首先找到记录。我也不太关心在凌晨2点直接停车,只要是在第一班的早上6点之前。

SELECT 
    * 
FROM 
    Cycle 
WHERE 
    CONVERT(VARCHAR(10), StartTime, 108) >= '16:30:00'
    AND 
    CONVERT(VARCHAR(10), DATEADD(DD, 1, StartTime), 108) < '06:00:00'

1 个答案:

答案 0 :(得分:0)

根据您的需求,并假设TSQL,只需将日期提前3小时,这样您就不必处理交叉。然后你可以在下午3点到下午1点和下午1点半到下午3点30分之间使用BETWEEN来获得你们的小组。

SELECT ProgramNo, MachineId, DATEADD(HOUR, -3, StartTime) AS StartTime, DATEADD(HOUR, -3, StopTime) AS StopTime, Cycle, Idle
FROM {tableName}

编辑:鉴于OP最近在上面的评论中添加了查询,我的快速而肮脏的解决方案将是这样的:

SELECT ProgramNo, MachineId,
    SUM(CASE WHEN CONVERT(VARCHAR, StartTime, 108) BETWEEN '3:00:00' AND '13:00:00' THEN Cycle ELSE 00:00:00 END) AS Shift1Cycle,
    SUM(CASE WHEN CONVERT(VARCHAR, StartTime, 108) BETWEEN '13:30:00' AND '23:30:00' THEN Cycle ELSE 00:00:00 END) AS Shift2Cycle,
FROM
(
    SELECT ProgramNo, MachineId, DATEADD(HOUR, -3, StartTime) AS StartTime, DATEADD(HOUR, -3, StopTime) AS StopTime, Cycle, Idle
    FROM Cycle
) a
GROUP BY ProgramNo, MachineId

显然会有一些边缘情况,如评论中所提到的,但这会照顾到给出的简单用例。 SUM应该是Cycle的小时,分​​钟和秒,日期为01/01/1900。