업데이트 답 :
좋아, 나는 같은 날에없는 입력하고 종료 날짜 사례를 반영하고 Enter를 종료 시간이 한 시간 이상에 차이 샘플 데이터를 조정.
CREATE TABLE t
(`Name` varchar(4), `Enter` datetime, `Exit` datetime)
;
INSERT INTO t
(`Name`, `Enter`, `Exit`)
VALUES
('Jack', '2014-01-01 01:00:00', '2014-01-01 02:00:00'),
('Sam', '2014-01-01 02:00:00', '2014-01-01 05:00:00'),
('Jane', '2014-01-01 02:00:00', '2014-01-01 03:00:00'),
('Judy', '2014-01-01 03:00:00', '2014-01-03 04:00:00')
;
일을 쉽게하기 위해 샘플 데이터를 다루는 날짜 범위가 포함 된 표를 만들었습니다.
이 빠른 해킹은 우리 테이블에 66 개의 숫자를 삽입했습니다. 다음으로 샘플 데이터를 다루는 날짜를 생성합니다.
update n
set b = '2014-01-01 00:00:00' + interval a hour;
이제 우리는 우리가 단순히 조인이 테이블을 사용할 수 2014-01-01 00:00:00
및 2014-01-03 18:00:00
사이마다 전체 시간 날짜 시간 값이 있는지 확인하십시오.
select date(n.b), hour(n.b), count(*)
from
t inner join n on n.b between t.Enter and t.Exit
group by 1, 2
이렇게하면 입력 시간과 종료 시간 사이에 1 시간마다 기록을 얻습니다. 결과는 다음과 같습니다.
| DATE | HOUR | COUNT(*) |
|------------|------|----------|
| 2014-01-01 | 1 | 1 |
| 2014-01-01 | 2 | 3 |
| 2014-01-01 | 3 | 3 |
| 2014-01-01 | 4 | 2 |
| 2014-01-01 | 5 | 2 |
| 2014-01-01 | 6 | 1 |
| 2014-01-01 | 7 | 1 |
| 2014-01-01 | 8 | 1 |
| 2014-01-01 | 9 | 1 |
| 2014-01-01 | 10 | 1 |
| 2014-01-01 | 11 | 1 |
| 2014-01-01 | 12 | 1 |
| 2014-01-01 | 13 | 1 |
| 2014-01-01 | 14 | 1 |
| 2014-01-01 | 15 | 1 |
| 2014-01-01 | 16 | 1 |
| 2014-01-01 | 17 | 1 |
| 2014-01-01 | 18 | 1 |
| 2014-01-01 | 19 | 1 |
| 2014-01-01 | 20 | 1 |
| 2014-01-01 | 21 | 1 |
| 2014-01-01 | 22 | 1 |
| 2014-01-01 | 23 | 1 |
| 2014-01-02 | 0 | 1 |
| 2014-01-02 | 1 | 1 |
| 2014-01-02 | 2 | 1 |
| 2014-01-02 | 3 | 1 |
| 2014-01-02 | 4 | 1 |
| 2014-01-02 | 5 | 1 |
| 2014-01-02 | 6 | 1 |
| 2014-01-02 | 7 | 1 |
| 2014-01-02 | 8 | 1 |
| 2014-01-02 | 9 | 1 |
| 2014-01-02 | 10 | 1 |
| 2014-01-02 | 11 | 1 |
| 2014-01-02 | 12 | 1 |
| 2014-01-02 | 13 | 1 |
| 2014-01-02 | 14 | 1 |
| 2014-01-02 | 15 | 1 |
| 2014-01-02 | 16 | 1 |
| 2014-01-02 | 17 | 1 |
| 2014-01-02 | 18 | 1 |
| 2014-01-02 | 19 | 1 |
| 2014-01-02 | 20 | 1 |
| 2014-01-02 | 21 | 1 |
| 2014-01-02 | 22 | 1 |
| 2014-01-02 | 23 | 1 |
| 2014-01-03 | 0 | 1 |
| 2014-01-03 | 1 | 1 |
| 2014-01-03 | 2 | 1 |
| 2014-01-03 | 3 | 1 |
| 2014-01-03 | 4 | 1 |
물론 도움 테이블을 조정해야합니다. 분명히 주위의 테이블을 돕는 것은 나쁜 것이 아닙니다.
다시 여기에 sqlfiddle이 있습니다.
원래 답 :
select date(a), hour(a), count(*) from ( select enter as a from t union all select `exit` as a from t ) b group by 1, 2
주에 살고 작업을 참조하십시오.
- 시간은 항상
- 를 입력하고 종료 날짜가 같은 날에 항상 전체 시간에 있습니다
- 입력하고 종료 시간은 한 시간 만에 다른
이러한 가정 중 하나가 사실이 아니라면 훨씬 복잡해집니다.
http://sqlfiddle.com/에서 테스트 케이스를 설정 한 다음 시도를 보여주고 결과를 여기에서 다시 공유하십시오. – crowne
WHILE LOOP (EnterValue <= ExitValue) SELECT 문을 사용하여 날짜, 시간, 카운트를 얻은 다음 시간을 늘리십시오. 인터벌 1 시간은 좋은 논리적 시작이 될 것입니다. – Hituptony