разница во времени между многими датами для многих устройств, которые останавливаются и запускаются (рабочее время) - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть такая таблица:

        date        | machine | activity_type | Status
31.12.2018 23:15:00 | device2 |     type2     | Start
1.1.2019   00:05:00 | device1 |     type1     | Start
1.1.2019   00:10:00 | device2 |     type2     |  Stop
1.1.2019   00:15:00 | device2 |     type1     | Start
1.1.2019   00:20:00 | device1 |     type1     |  Stop
1.1.2019   00:25:00 | device1 |     type3     | Start
2.1.2019   00:23:00 | device1 |     type3     |  Stop
3.1.2019   00:00:00 | device2 |     type1     |  Stop

Мой желаемый результат (для дня 1.1.2019) будет:

date              | Duration | Activity_type | Machine
1.1.2019 00:05:00 | 00:15:00 |    type1      | device1
1.1.2019 00:00:00 | 00:10:00 |    type2      | device2
1.1.2019 00:15:00 | 23:45:00 |    type1      | device2
1.1.2019 00:25:00 | 23:35:00 |    type3      | device1

Так что:

Устройство 1 запускается в 00:05:00 и останавливается в 00:20:00, поэтому продолжительность составляет 00: 15: 00.

Устройство 2 останавливается (работа началась на день раньше) в 00:10:00, поэтому продолжительность00: 10: 00.

Устройство 2 запускается в 00:15:00 и не прекращает работу в этот день, поэтому продолжительность составляет 23: 45: 00.

Устройство 1 запускается в 00:25:00 и также не перестает работать в этот день, поэтому продолжительность составляет 23: 35: 00

Я придумал это, но он продолжает показывать NULL

SELECT
w1.Machine,
w1.Date,
w1.Type,
DateDiff(SECOND,[prevdate],[Date]) AS Duration
FROM
(
    SELECT
        Maszyna,
        Typ,
        Date,
        (
            SELECT Max(Date)
            FROM WorkHours as T2
            WHERE
                T2.Machine=T1.Machine
            AND T2.Type=T1.Type
            AND T2.Date < T1.Date
        ) AS prevdate
    FROM WorkHours AS T1
    ) as w1;

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Здесь я сделал T-SQL для вашего случая.

Схема:

CREATE TABLE Your_Table(date DATETIME,machine VARCHAR(100),activity_type VARCHAR(100), Status VARCHAR(10))

INSERT INTO Your_Table VALUES('2018-12-31 23:15:00','device2','type2','Start')
INSERT INTO Your_Table VALUES('2019-01-01 00:05:00','device1','type1','Start')
INSERT INTO Your_Table VALUES('2019-01-01 00:10:00','device2','type2','Stop')
INSERT INTO Your_Table VALUES('2019-01-01 00:15:00','device2','type1','Start')
INSERT INTO Your_Table VALUES('2019-01-01 00:20:00','device1','type1','Stop')
INSERT INTO Your_Table VALUES('2019-01-01 00:25:00','device1','type3','Start')
INSERT INTO Your_Table VALUES('2019-01-02 00:23:00','device1','type3','Stop')
INSERT INTO Your_Table VALUES('2019-01-03 00:00:00','device2','type1','Stop')
INSERT INTO Your_Table VALUES('2019-01-03 00:05:00','device2','type2','Start')
INSERT INTO Your_Table VALUES('2019-01-03 00:25:00','device2','type2','Stop')

И я передаю date value в переменных ииспользуйте их в Запросе.

DECLARE @Date DATETIME = '2019-01-01 00:00:00',@EndDate DATETIME = '2019-01-02 00:00:00'

SELECT MIN(date),
    CONVERT(varchar(12),DATEADD(minute,DATEDIFF(MINUTE,CASE WHEN MAX(CASE WHEN Status = 'Start' THEN date END)<@Date THEN @Date ELSE MAX(CASE WHEN Status = 'Start' THEN date END) END,
             CASE WHEN MAX(CASE WHEN Status = 'Stop' THEN date END)>@EndDate THEN @EndDate ELSE MAX(CASE WHEN Status = 'Stop' THEN date END) END),0), 114)
             ,Activity_type
             ,Machine
FROM(
    SELECT *,
       ((ROW_NUMBER() OVER(PARTITION BY machine,activity_type ORDER BY date))+1)/2 RN 
    FROM Your_Table
    )A
GROUP BY Activity_type,Machine,RN

Вы можете проверить вывод в SQL Fiddle

0 голосов
/ 07 ноября 2019

Вот решение: вы присоединяете свою таблицу к себе и используете оконную функцию для возврата следующего соответствующего события остановки для каждого события запуска

Запрос возвращает все события, которые начались 1 января, и их соответствующую остановку. события (событие останова имеет тот же тип машины и действия)

NB - я думаю, что 2-я строка в вашем ожидаемом выводе является ошибочной, так как нет события останова для устройства 2, типа 2 (оно также похоже на этоимеет опечатку - должно 1.1.2019 00:00:00 быть 1.1.2019 00:10:00?)

CREATE TABLE StartTimes
(
    [Date]          DATETIME,
    Machine         VARCHAR(7),
    Activity_Type   VARCHAR(5),
    [Status]        VARCHAR(5)
)

INSERT INTO StartTimes VALUES

('12/31/2018 23:15:00','device2','type2','Start'),
('1/1/2019   00:05:00','device1','type1','Start'),
('1/1/2019   00:10:00','device2','type2','Stop'),
('1/1/2019   00:15:00','device2','type1','Start'),
('1/1/2019   00:20:00','device1','type1','Stop'),
('1/1/2019   00:25:00','device1','type3','Start'),
('1/2/2019   00:23:00','device1','type3','Stop'),
('1/3/2019   00:00:00','device2','type1','Stop')

SELECT  StartDate,
        EndDate,
        CONVERT(varchar(12), DATEADD(MINUTE,DATEDIFF(MINUTE,StartDate,EndDate),0),114) AS Duration,
        Activity_Type,
        Machine
FROM    (
          SELECT    s.[Date] AS StartDate,
                    s.Machine,
                    s.Activity_Type,
                    s.[Status],
                    s1.[Date] AS EndDate,
                    ROW_NUMBER() OVER (PARTITION BY s.date ORDER BY s1.Date) as RowN
          FROM      StartTimes s
                    JOIN StartTimes s1
                        ON s.[Date] < s1.[Date] AND
                           s.Machine = s1.Machine AND
                           s.Activity_Type = s1.Activity_Type AND
                           s.Status = 'Start' AND
                           s1.Status = 'Stop'
       ) a
WHERE  RowN= 1 AND
       [StartDate] >= '2019-01-01' AND
       [StartDate]  < '2019-01-02'
ORDER BY StartDate
...