이것은 기본적인 아이디어입니다 ... 그것은 단일 row and
열 , which you can then fetch with
PHP` ...
이 솔루션은, 즉 & 시작이 쌍으로 중지하는 가정은 : 시작의 ID는 정지의 +1
될 것입니다. 그렇지 않은 경우 의 ID는 >
이며 중지 된 ID는 LIMIT
입니다. 1
입니다.
자체 조인은 최적의 성능을 낼 수 없으므로 일부 데이터가 안전한쪽에 있도록주의해서 실행 시간을 측정하십시오. 당신은 기계가 정지 아직 다시 시작하지 않은 시간을 포함 할 경우
http://sqlfiddle.com/#!9/de72bf/1
CREATE TABLE fillercdown (
`fillercdown_ndx` int(11) NOT NULL AUTO_INCREMENT,
`time` datetime DEFAULT NULL,
`B3_4_5` int(11) DEFAULT NULL,
PRIMARY KEY (`fillercdown_ndx`),
KEY `fillercdowntimendx` (`time`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
INSERT INTO fillercdown
(`time`, `B3_4_5`)
VALUES
('2016-06-16 14:00:45', 0),
('2016-06-16 14:01:00', 1),
('2016-06-16 16:00:00', 0),
('2016-06-16 16:01:00', 1)
;
SELECT SUM(TIMEDIFF(g.`time`, f.`time`))
FROM fillercdown f
INNER JOIN fillercdown g
ON g.`fillercdown_ndx` = (f.`fillercdown_ndx` + 1)
AND g.`B3_4_5` = 1
AND TIME(g.`time`) BETWEEN '08:00:00' AND '17:00:00'
WHERE f.`B3_4_5` = 0
AND TIME(f.`time`) BETWEEN '08:00:00' AND '17:00:00'
, 당신은 같은 것을 할 수 있습니다
http://sqlfiddle.com/#!9/d113b9/9
INSERT INTO fillercdown
(`time`, `B3_4_5`)
VALUES
('2016-06-16 14:00:45', 0),
('2016-06-16 14:01:00', 1),
('2016-06-16 16:00:00', 0),
('2016-06-16 16:01:00', 1),
('2016-06-16 16:02:00', 0)
;
SELECT SUM(TIMEDIFF(COALESCE(g.`time`, '2016-06-16 16:02:01'), f.`time`))
FROM fillercdown f
LEFT JOIN fillercdown g
ON g.`fillercdown_ndx` = (f.`fillercdown_ndx` + 1)
AND g.`B3_4_5` = 1
AND TIME(g.`time`) BETWEEN '08:00:00' AND '17:00:00'
WHERE TIME(f.`time`) BETWEEN '08:00:00' AND '17:00:00' AND f.`B3_4_5` = 0
당신은 대체 할 수 과 NOW()
또는 f.time
을 기반으로 한 값은 물론 응용 프로그램이 필요합니다.
NULL
을 절대 받고 싶지 않고 0
을 얻으려면 일치하는 행이없는 경우 COALESCE(SUM(...), 0)
과 같이하십시오.
SELECT f.`time`, f.`B3_4_5`
FROM fillercdown f
WHERE TIME(f.`time`) BETWEEN '08:00:00' AND '17:00:00'
을 그리고 그렇게 (psuedocode) 같은 합계를 계산 : 당신이 스크립트 솔루션을 선호하는 경우
당신은 항상 이런 식으로 뭔가를 할 수
stopped = null;
pairs = []
for (row in rows)
if (row.isStopped) stopped = row
else
pairs += [stopped, row]
stopped = null
sum = 0
for (pair in pairs)
sum += duration(pair[0], pair[1])
: 당신은
format
방법을 사용하여 메시지를 반환받을 수 있나요? 또한 : a) 특정 '0'에서 다음에 '1'이 나타날 때까지의 지속 시간을 알고 싶습니까? 즉, 'fillercdown_ndx'를 알고 계십니까? b) 모두로부터? c) 평균? – Centril업데이트 됨 자세한 내용을 확인하시기 바랍니다. 미안 나는 아직도 정말로 배우고있다. 그러나 최선을 다해 노력하고있다. 이것은 막 붙어 있습니다. –
질문을 올바르게 이해하면 X와 Y 시간 내에 (0,1)의 모든 쌍을 선택하고 그 간격의 합을 계산하고 싶습니까? – Centril