2014-12-19 2 views
0

데이터베이스 MySQL에이 데이터 테이블이 있습니다. 9905.MySQL 비교 날짜 시간

나도 같은 코딩 시작 날짜의 시간을 한 시간 내에서 반복 될 때 모든 행을 삭제 한 쿼리가 필요

:이 표에서

+---------------------+---------------------+--------+----+ 
| Start___Date  | End___Date   | Coding | ID | 
+---------------------+---------------------+--------+----+ 
| 2014-12-16 18:08:51 | 2014-12-16 20:00:16 | 7605 | 1 | 
| 2014-12-16 22:01:39 | 2014-12-16 23:36:36 | 9905 | 2 | 
| 2014-12-16 22:45:00 | 2014-12-16 23:36:36 | 9905 | 3 | 
| 2014-12-16 23:18:32 | 2014-12-16 23:19:04 | 9905 | 4 | 
+---------------------+---------------------+--------+----+ 

나는 3 개의 동일한 코딩이있다.

이 경우 행 번호 3을 취소해야합니다.

+---------------------+---------------------+--------+----+ 
| Start___Date  | End___Date   | Coding | ID | 
+---------------------+---------------------+--------+----+ 
| 2014-12-16 18:08:51 | 2014-12-16 20:00:16 | 7605 | 1 | 
| 2014-12-16 22:01:39 | 2014-12-16 23:36:36 | 9905 | 2 | 
| 2014-12-16 23:18:32 | 2014-12-16 23:19:04 | 9905 | 4 | 
+---------------------+---------------------+--------+----+ 

동일한 부호 9905은 시작 시간 (22시 1분)에 비해 시간 내에 두 테이블에 기록 시작 시간 (23시 18분)이 때문에 9905을 코딩 레코드 번호 (4)를 저장하고 있기 때문에 동일한 코딩으로 시작 시간 (22:01)보다 더 깁니다.

도와 주시겠습니까? 미리 감사드립니다.

내가이 쿼리를 시도 1

편집 번호는 가입하지만 출력은 잘못된 것입니다 :

mysql> SELECT 
    CB.Start___Date, 
    CB.End___Date, 
    CB.Coding 
FROM 
    doTable AS CB 
JOIN doTable AS CD ON (CB.Coding = CD.Coding) 
WHERE 
    TIME_TO_SEC(
     TIMEDIFF(
      CB.Start___Date, 
      CD.Start___Date 
     ) 
    )/60 > 60 
GROUP BY 
    CB.Coding; 
+---------------------+---------------------+--------+ 
| Start___Date  | End___Date   | Coding | 
+---------------------+---------------------+--------+ 
| 2014-12-16 23:18:32 | 2014-12-16 23:19:04 | 9905 | 
+---------------------+---------------------+--------+ 
1 row in set 
+1

어서. 뭔가 해봐. 아마도 JOIN으로 뭔가를 시도해보십시오. – Strawberry

+0

또한 4 번 행이 3 번 행의 1 시간 이내에 있으므로 왜 삭제되지 않습니까? – Strawberry

+0

나는 약간의 결함이 있다고 생각한다. cronjob에서 분 단위로 삭제 쿼리를 실행 하시겠습니까? 그렇다면 상대적으로 간단합니다. 그러나 쿼리에서 삭제할 항목을 찾으려면 쿼리를 실행할 때마다 다른 종류의 물고기가 필요합니다. 예를 들어 며칠 후, 코드 9905로 여러 레코드를 가질 수 있습니다. 시작점은 어디에 있습니까? 예를 들어 코드 9905가있는 다른 레코드가 시작 날짜 2014-12-16 23:20:00으로 삽입 된 경우 해당 레코드가 id 2로 인해 허용되거나 삭제되었거나 id 4로 인해 삭제됩니까? 그렇다면 아마도 MySQL을 사용하여 문제를 해결할 수 없을 것입니다. –

답변

1

이 내 문제에 대한 솔루션, 행복 코딩입니다!

mysql> DROP TABLE 
IF EXISTS `doTable1`; 

CREATE TABLE `doTable1` (
    `coding` INT (10) DEFAULT NULL, 
    `Start___Date` datetime DEFAULT NULL, 
    `id` INT (10) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
) ENGINE = MyISAM; 

INSERT INTO `doTable1` (coding, Start___Date)(
    SELECT 
     coding, 
     MIN(Start___Date) 
    FROM 
     doTable 
    GROUP BY 
     coding 
); 

SELECT 
    a.*, b.*, TIMEDIFF(
     a.Start___Date, 
     b.Start___Date 
    ) AS diff 
FROM 
    doTable a 
JOIN `doTable1` b ON a.coding = b.coding 
WHERE 
    (
     TIMEDIFF(
      a.Start___Date, 
      b.Start___Date 
     ) = '00:00:00' 
     OR TIMEDIFF(
      a.Start___Date, 
      b.Start___Date 
     ) >= '01:01:01' 
    ); 
Query OK, 0 rows affected 

Query OK, 0 rows affected 

Query OK, 2 rows affected 
Records: 2 Duplicates: 0 Warnings: 0 

+--------+---------------------+---------------------+----+--------+---------------------+----+----------+ 
| Coding | End___Date   | Start___Date  | ID | coding | Start___Date  | id | diff  | 
+--------+---------------------+---------------------+----+--------+---------------------+----+----------+ 
| 7605 | 2014-12-16 20:00:16 | 2014-12-16 18:08:51 | 1 | 7605 | 2014-12-16 18:08:51 | 1 | 00:00:00 | 
| 9905 | 2014-12-16 23:36:36 | 2014-12-16 22:01:39 | 2 | 9905 | 2014-12-16 22:01:39 | 2 | 00:00:00 | 
| 9905 | 2014-12-16 23:19:04 | 2014-12-16 23:18:32 | 4 | 9905 | 2014-12-16 22:01:39 | 2 | 01:16:53 | 
+--------+---------------------+---------------------+----+--------+---------------------+----+----------+ 
3 rows in set 
0

당신이 분을 조회하고 있는지 확인 할 수 있습니다 다음과의보다 큰 또는 작은 시간.

datediff(minute,@startDate,@endDate) as minutes; 

분이 있고 1 시간 미만인지 결정한 다음 행을 삭제할 수 있는지를 결정한 후 다음과 같은

뭔가 : (정확하지 않을 수 있습니다하지만 당신은 요점을 파악)

DELETE 
FROM 
    ExampleTable 
WHERE 
    DATEDIFF(minute,@startDate,@endDate) < 61 
+0

SELECT DATEDIFF (분, '2014-12-16 22:01:39', '2014-12-16 22:45:00') <61; [Err] 1582 - 네이티브 함수 'DATEDIFF' –

+0

에 대한 호출에서 잘못된 매개 변수 개수가'datediff'가 아닌'timestampdiff'입니다. –