Tsql 夜班

Tsql 夜班,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我有3台机器用于制造的输出数据。输出如下所示: 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:0

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

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
ID MachineId程序无开始时间停止时间循环空闲
327628 3 W5_2020_OPP2.MPF 12/15/15 23:29 12/15/15 23:29 0:00: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_两者。强积金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: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_两者都有。强积金12/16/15 0:47 12/16/15 1:44 0:56:42 0:02:03
我们有两个班次运行这些机器,上午6点到下午4点和下午4:30到凌晨2:30。我需要根据程序编号和机器ID对每个班次的循环时间进行合计。我可以很容易地将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'
选择
* 
从…起
周期
哪里
转换(VARCHAR(10),StartTime,108)>='16:30:00'
及
转换(VARCHAR(10),DATEADD(DD,1,StartTime),108)<'06:00:00'

根据您的需要,假设使用TSQL,只需将日期备份3小时,这样您就不必处理交叉问题。然后,您可以使用介于凌晨3点到下午1点和下午1:30到11:30之间的时间来获取您的群组

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

显然会有一些边缘案例,如评论中所提到的,但这需要考虑给出的简单用例。总和应为产生的小时、分钟和秒周期,日期为1900年1月1日。

根据您的需要,并假设TSQL,只需将日期备份3小时,这样您就不必处理交叉。然后,您可以使用介于凌晨3点到下午1点和下午1:30到11:30之间的时间来获取您的群组

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

显然会有一些边缘案例,如评论中所提到的,但这需要考虑给出的简单用例。总和应为产生的小时、分钟和秒周期,日期为1900年1月1日。

您使用的语言是什么?到目前为止,您尝试了什么?SQL R2 2008中的T-SQL。我还没有试着做总数,主要是先找到记录。我也不太在意凌晨2点直接停车,只要是在第一班早上6点之前。从CONVERT(VARCHAR(10),StartTime,108)>='16:30:00'和CONVERT(VARCHAR(10),DATEADD(DD,1,StartTime),108)<'06:00:00'的循环中选择*原始问题中需要包含的信息…您使用什么语言进行此操作?到目前为止,您尝试了什么?SQL R2 2008中的T-SQL。我还没有试着做总数,主要是先找到记录。我也不太在意凌晨2点直接停车,只要是在第一班早上6点之前。从CONVERT(VARCHAR(10),StartTime,108)>='16:30:00'和CONVERT(VARCHAR(10),DATEADD(DD,1,StartTime),108)<'06:00:00'的循环中选择*原始问题中需要的信息…如果他们因为紧急原因在凌晨1点开始换班,会发生什么情况?:)如果他们因为紧急原因在凌晨1点开始换班,会发生什么情况?:)