2016-07-05 5 views
0

제조용 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 

오전 6 시부 터 오후 4 시까 지, 오후 4시 30 분 - 오전 2시 30 분이 기계를 2 교대로 실행합니다. 프로그램 번호와 머신 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' 
+0

이 언어를 사용하는 언어는 무엇입니까? 지금까지 뭐 해봤 어? – Taegost

+0

SQL R2 2008의 T-SQL입니다. 아직 전체를 수행하지는 않았지만 주로 레코드를 먼저 찾는데 집중했습니다. 나는 또한 오전 2시에 직접 멈추는 것에 너무 신경 쓰지 않았다. 첫 시합에서 오전 6시 이전이었던 한 오래되었다. SELECT * VARCHAR (10), DATEADD (DD, 1, StartTime), 108) CONVERT (VARCHAR (10), StartTime, 108)> = '16 : 30 : 00' 및 CONVERT <'06 : 00 : 00 ' – volleygirl029

+0

그 정보는 원래의 질문에 있어야합니다 ... – Taegost

답변

0

필요에 따라 TSQL을 가정하면 날짜를 최대 3 시간까지 되돌릴 수 있으므로 크로스 오버를 처리 할 필요가 없습니다. 그런 다음 3 시부 터 오후 1시 30 분까지 오후 1시 30 분 - 오후 1시 30 분 사이에 그룹을 나누기 위해 BETWEEN을 사용할 수 있습니다. 언급 한 바와 같이,

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 

는 물론 일부 가장자리 경우가있을 예정 :

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

편집 : 최근 OP로 위의 의견에 추가 된 쿼리를 감안할 때, 내 신속하고 더러운 솔루션은 다음과 같이 될 것이다 코멘트에서,하지만 이것은 주어진 간단한 유스 케이스 돌봐. SUM은 1900 년 1 월 1 일의 날짜가있는 Cycle의 결과 시간, 분 및 초이어야합니다.

+0

비상 사태로 인해 오전 1시에 근무를 시작하면 어떻게됩니까? :) – objectNotFound