2017-10-02 9 views
0

J'essaie de trouver une solution pour trouver le chevauchement dans le cas ci-dessous.Vérifiez le chevauchement par chaque ID, SQL Server 2008

J'ai deux tables avec l'ID employé, le nombre ou le temps de pause, l'heure de début et de fin planifiée de pause. Dans une situation idéale, le nombre de pauses planifiées et utilisées devrait être le même mais ce n'est pas le cas. Ce que je dois faire est de comparer par ID et de vérifier si la pause est utilisée dans le même temps que prévu, sinon quelle est la différence.

Mon idée est de vérifier par ID chaque numéro avec chaque nombre dans la deuxième table et le marquer ok/pas ok une grande quelle est l'écart. Je mince il y a une meilleure façon, plus efficace de le faire. Pourriez-vous m'aider à trouver la solution?

J'apprécierai chaque invite.

ID | number | time_start_plan   | time_stop_plan 
-----+--------+-------------------------+------------------------ 
965 | 1  | 2017-09-11 00:00:00.000 | 2017-09-11 00:15:00.000 
965 | 2  | 2017-09-11 01:15:00.000 | 2017-09-11 01:25:00.000 
965 | 3  | 2017-09-11 02:40:00.000 | 2017-09-11 02:50:00.000 
965 | 4  | 2017-09-11 04:20:00.000 | 2017-09-11 04:30:00.000 
1122 | 1  | 2017-09-11 00:05:00.000 | 2017-09-11 00:20:00.000 
1122 | 2  | 2017-09-11 01:20:00.000 | 2017-09-11 01:30:00.000 
1122 | 3  | 2017-09-11 03:10:00.000 | 2017-09-11 03:20:00.000 

ID | number | time_start_used   | time_stop_used 
-----+--------+-------------------------+------------------------ 
965 | 1  | 2017-09-11 00:34:41.000 | 2017-09-11 00:36:34.000 
965 | 2  | 2017-09-11 02:33:00.000 | 2017-09-11 02:36:26.000 
965 | 3  | 2017-09-11 04:24:17.000 | 2017-09-11 04:27:42.000 
965 | 4  | 2017-09-11 06:06:02.000 | 2017-09-11 06:18:19.000 
965 | 5  | 2017-09-11 22:41:02.000 | 2017-09-11 22:42:06.000 
1122 | 1  | 2017-09-11 00:15:12.000 | 2017-09-11 00:15:32.000 
1122 | 2  | 2017-09-11 01:07:56.000 | 2017-09-11 01:26:57.000 
1122 | 3  | 2017-09-11 01:49:02.000 | 2017-09-11 01:51:13.000 
1122 | 4  | 2017-09-11 03:33:50.000 | 2017-09-11 03:34:17.000 
1122 | 5  | 2017-09-11 04:07:59.000 | 2017-09-11 04:09:10.000 
1122 | 6  | 2017-09-11 05:51:23.000 | 2017-09-11 05:54:22.000 
+0

qu'entendez-vous par écart? Est-ce une différence de temps (nombre de minutes/heures) ignorant l'heure réelle de début et de fin par rapport à prévu une fois? – Rex

+0

Désolé, je dois clarifier. Je veux dire le décalage horaire, par exemple: 2017-09-11 01: 15: 00.000 - 2017-09-11 02: 33: 00.000 est de 78 minutes de différence, j'ai besoin de lignes où il sera plus de 5 minutes, je vais vérifier eux pourquoi il est plus grand que prévu. – Mateusz

+0

Donc, vous voulez dire, même si la date et l'heure de début et d'arrêt diffèrent de prévues par rapport à réelles mais si le temps varie, alors mettez en place comme non OK? pour ex: - Id = 965 et nombre = 1 les heures de début et de fin sont différentes. Dans ce cas, vous souhaitez afficher comme Pas Ok. droite? – Rex

Répondre

0

Je pense que vous aurez besoin d'une jointure externe comme dans cet exemple aussi ici à SQL Fiddle

CREATE TABLE Table1 
    ([ID] int, [number] int, [time_start_plan] datetime, [time_stop_plan] datetime) 
; 

INSERT INTO Table1 
    ([ID], [number], [time_start_plan], [time_stop_plan]) 
VALUES 
    (965, 1, '2017-09-11 00:00:00.000', '2017-09-11 00:15:00.000'), 
    (965, 2, '2017-09-11 01:15:00.000', '2017-09-11 01:25:00.000'), 
    (965, 3, '2017-09-11 02:40:00.000', '2017-09-11 02:50:00.000'), 
    (965, 4, '2017-09-11 04:20:00.000', '2017-09-11 04:30:00.000'), 
    (1122, 1, '2017-09-11 00:05:00.000', '2017-09-11 00:20:00.000'), 
    (1122, 2, '2017-09-11 01:20:00.000', '2017-09-11 01:30:00.000'), 
    (1122, 3, '2017-09-11 03:10:00.000', '2017-09-11 03:20:00.000'); 


CREATE TABLE Table2 
    ([ID] int, [number] int, [time_start_used] datetime, [time_stop_used] datetime) 
; 

INSERT INTO Table2 
    ([ID], [number], [time_start_used], [time_stop_used]) 
VALUES 
    (965, 1, '2017-09-11 00:34:41.000', '2017-09-11 00:36:34.000'), 
    (965, 2, '2017-09-11 02:33:00.000', '2017-09-11 02:36:26.000'), 
    (965, 3, '2017-09-11 04:24:17.000', '2017-09-11 04:27:42.000'), 
    (965, 4, '2017-09-11 06:06:02.000', '2017-09-11 06:18:19.000'), 
    (965, 5, '2017-09-11 22:41:02.000', '2017-09-11 22:42:06.000'), 
    (1122, 1, '2017-09-11 00:15:12.000', '2017-09-11 00:15:32.000'), 
    (1122, 2, '2017-09-11 01:07:56.000', '2017-09-11 01:26:57.000'), 
    (1122, 3, '2017-09-11 01:49:02.000', '2017-09-11 01:51:13.000'), 
    (1122, 4, '2017-09-11 03:33:50.000', '2017-09-11 03:34:17.000'), 
    (1122, 5, '2017-09-11 04:07:59.000', '2017-09-11 04:09:10.000'), 
    (1122, 6, '2017-09-11 05:51:23.000', '2017-09-11 05:54:22.000') 
; 

Recherche:

select 
     coalesce(t1.id, t2.id) ids 
    , coalesce(t1.number, t2.number) numbers 
    , datediff(minute,t1.time_start_plan, t2.time_start_used) diff_start 
    , datediff(minute,t1.time_stop_plan, t2.time_stop_used) diff_stop 
    , t1.time_start_plan 
    , t2.time_start_used 
    , t1.time_stop_plan 
    , t2.time_stop_used 
from table1 t1 
full outer join table2 t2 on t1.id = t2.id and t1.number = t2.number 
order by ids, numbers 

Results:

| ids | numbers | diff_start | diff_stop |  time_start_plan |  time_start_used |  time_stop_plan |  time_stop_used | 
|------|---------|------------|-----------|----------------------|----------------------|----------------------|----------------------| 
| 965 |  1 |   34 |  21 | 2017-09-11T00:00:00Z | 2017-09-11T00:34:41Z | 2017-09-11T00:15:00Z | 2017-09-11T00:36:34Z | 
| 965 |  2 |   78 |  71 | 2017-09-11T01:15:00Z | 2017-09-11T02:33:00Z | 2017-09-11T01:25:00Z | 2017-09-11T02:36:26Z | 
| 965 |  3 |  104 |  97 | 2017-09-11T02:40:00Z | 2017-09-11T04:24:17Z | 2017-09-11T02:50:00Z | 2017-09-11T04:27:42Z | 
| 965 |  4 |  106 |  108 | 2017-09-11T04:20:00Z | 2017-09-11T06:06:02Z | 2017-09-11T04:30:00Z | 2017-09-11T06:18:19Z | 
| 965 |  5 |  (null) | (null) |    (null) | 2017-09-11T22:41:02Z |    (null) | 2017-09-11T22:42:06Z | 
| 1122 |  1 |   10 |  -5 | 2017-09-11T00:05:00Z | 2017-09-11T00:15:12Z | 2017-09-11T00:20:00Z | 2017-09-11T00:15:32Z | 
| 1122 |  2 |  -13 |  -4 | 2017-09-11T01:20:00Z | 2017-09-11T01:07:56Z | 2017-09-11T01:30:00Z | 2017-09-11T01:26:57Z | 
| 1122 |  3 |  -81 |  -89 | 2017-09-11T03:10:00Z | 2017-09-11T01:49:02Z | 2017-09-11T03:20:00Z | 2017-09-11T01:51:13Z | 
| 1122 |  4 |  (null) | (null) |    (null) | 2017-09-11T03:33:50Z |    (null) | 2017-09-11T03:34:17Z | 
| 1122 |  5 |  (null) | (null) |    (null) | 2017-09-11T04:07:59Z |    (null) | 2017-09-11T04:09:10Z | 
| 1122 |  6 |  (null) | (null) |    (null) | 2017-09-11T05:51:23Z |    (null) | 2017-09-11T05:54:22Z | 
+0

Merci pour l'aide, je n'ai pas précisé, ce que j'ai besoin de comparer est: chaque ligne forme table1 avec chaque rowrs sur table2 (le même ID). La raison en est que sur le t2 je pourrais avoir quelques rangées assorties f.eg. Le salarié devrait partir en pause à 00: 15-00: 30 et continuer sur 00: 16-00: 18 et 00: 19-00: 31, les deux seront corrects avec le break utilisé mais t2 a deux rangs correspondants. – Mateusz

+0

puis essayez-le ** SANS ** en utilisant la condition de jointure t1.number = t2.number mais vous obtiendrez beaucoup plus de lignes et beaucoup plus de résultats non pertinents aussi. –

+0

Vous pouvez essayer 'AND t2.number> = t1.number' ** au lieu de **' AND t2.number = t1.number' –

1

Cette variante de solution ne correspond que partiellement à [nombre] en ce que le numéro t1.ll doit être < = au numéro t2.i. Cela conduit bien sûr à beaucoup plus de lignes de sortie.

Voir ceci SQL Fiddle comme démonstration.

Recherche:

select 
     coalesce(t1.id, t2.id) ids 
    , coalesce(t1.number, t2.number) numbers 
    , datediff(minute,t1.time_start_plan, t2.time_start_used) diff_start 
    , datediff(minute,t1.time_stop_plan, t2.time_stop_used) diff_stop 
    , t1.time_start_plan 
    , t2.time_start_used 
    , t1.time_stop_plan 
    , t2.time_stop_used 
from table1 t1 
LEFT outer join table2 t2 on t1.id = t2.id and t1.number <= t2.number 
order by ids, numbers 

Results:

| ids | numbers | diff_start | diff_stop |  time_start_plan |  time_start_used |  time_stop_plan |  time_stop_used | 
|------|---------|------------|-----------|----------------------|----------------------|----------------------|----------------------| 
| 965 |  1 |   34 |  21 | 2017-09-11T00:00:00Z | 2017-09-11T00:34:41Z | 2017-09-11T00:15:00Z | 2017-09-11T00:36:34Z | 
| 965 |  1 |  153 |  141 | 2017-09-11T00:00:00Z | 2017-09-11T02:33:00Z | 2017-09-11T00:15:00Z | 2017-09-11T02:36:26Z | 
| 965 |  1 |  264 |  252 | 2017-09-11T00:00:00Z | 2017-09-11T04:24:17Z | 2017-09-11T00:15:00Z | 2017-09-11T04:27:42Z | 
| 965 |  1 |  366 |  363 | 2017-09-11T00:00:00Z | 2017-09-11T06:06:02Z | 2017-09-11T00:15:00Z | 2017-09-11T06:18:19Z | 
| 965 |  1 |  1361 |  1347 | 2017-09-11T00:00:00Z | 2017-09-11T22:41:02Z | 2017-09-11T00:15:00Z | 2017-09-11T22:42:06Z | 
| 965 |  2 |   78 |  71 | 2017-09-11T01:15:00Z | 2017-09-11T02:33:00Z | 2017-09-11T01:25:00Z | 2017-09-11T02:36:26Z | 
| 965 |  2 |  189 |  182 | 2017-09-11T01:15:00Z | 2017-09-11T04:24:17Z | 2017-09-11T01:25:00Z | 2017-09-11T04:27:42Z | 
| 965 |  2 |  291 |  293 | 2017-09-11T01:15:00Z | 2017-09-11T06:06:02Z | 2017-09-11T01:25:00Z | 2017-09-11T06:18:19Z | 
| 965 |  2 |  1286 |  1277 | 2017-09-11T01:15:00Z | 2017-09-11T22:41:02Z | 2017-09-11T01:25:00Z | 2017-09-11T22:42:06Z | 
| 965 |  3 |  104 |  97 | 2017-09-11T02:40:00Z | 2017-09-11T04:24:17Z | 2017-09-11T02:50:00Z | 2017-09-11T04:27:42Z | 
| 965 |  3 |  206 |  208 | 2017-09-11T02:40:00Z | 2017-09-11T06:06:02Z | 2017-09-11T02:50:00Z | 2017-09-11T06:18:19Z | 
| 965 |  3 |  1201 |  1192 | 2017-09-11T02:40:00Z | 2017-09-11T22:41:02Z | 2017-09-11T02:50:00Z | 2017-09-11T22:42:06Z | 
| 965 |  4 |  106 |  108 | 2017-09-11T04:20:00Z | 2017-09-11T06:06:02Z | 2017-09-11T04:30:00Z | 2017-09-11T06:18:19Z | 
| 965 |  4 |  1101 |  1092 | 2017-09-11T04:20:00Z | 2017-09-11T22:41:02Z | 2017-09-11T04:30:00Z | 2017-09-11T22:42:06Z | 
| 1122 |  1 |   10 |  -5 | 2017-09-11T00:05:00Z | 2017-09-11T00:15:12Z | 2017-09-11T00:20:00Z | 2017-09-11T00:15:32Z | 
| 1122 |  1 |   62 |  66 | 2017-09-11T00:05:00Z | 2017-09-11T01:07:56Z | 2017-09-11T00:20:00Z | 2017-09-11T01:26:57Z | 
| 1122 |  1 |  104 |  91 | 2017-09-11T00:05:00Z | 2017-09-11T01:49:02Z | 2017-09-11T00:20:00Z | 2017-09-11T01:51:13Z | 
| 1122 |  1 |  208 |  194 | 2017-09-11T00:05:00Z | 2017-09-11T03:33:50Z | 2017-09-11T00:20:00Z | 2017-09-11T03:34:17Z | 
| 1122 |  1 |  242 |  229 | 2017-09-11T00:05:00Z | 2017-09-11T04:07:59Z | 2017-09-11T00:20:00Z | 2017-09-11T04:09:10Z | 
| 1122 |  1 |  346 |  334 | 2017-09-11T00:05:00Z | 2017-09-11T05:51:23Z | 2017-09-11T00:20:00Z | 2017-09-11T05:54:22Z | 
| 1122 |  2 |  -13 |  -4 | 2017-09-11T01:20:00Z | 2017-09-11T01:07:56Z | 2017-09-11T01:30:00Z | 2017-09-11T01:26:57Z | 
| 1122 |  2 |   29 |  21 | 2017-09-11T01:20:00Z | 2017-09-11T01:49:02Z | 2017-09-11T01:30:00Z | 2017-09-11T01:51:13Z | 
| 1122 |  2 |  133 |  124 | 2017-09-11T01:20:00Z | 2017-09-11T03:33:50Z | 2017-09-11T01:30:00Z | 2017-09-11T03:34:17Z | 
| 1122 |  2 |  167 |  159 | 2017-09-11T01:20:00Z | 2017-09-11T04:07:59Z | 2017-09-11T01:30:00Z | 2017-09-11T04:09:10Z | 
| 1122 |  2 |  271 |  264 | 2017-09-11T01:20:00Z | 2017-09-11T05:51:23Z | 2017-09-11T01:30:00Z | 2017-09-11T05:54:22Z | 
| 1122 |  3 |  -81 |  -89 | 2017-09-11T03:10:00Z | 2017-09-11T01:49:02Z | 2017-09-11T03:20:00Z | 2017-09-11T01:51:13Z | 
| 1122 |  3 |   23 |  14 | 2017-09-11T03:10:00Z | 2017-09-11T03:33:50Z | 2017-09-11T03:20:00Z | 2017-09-11T03:34:17Z | 
| 1122 |  3 |   57 |  49 | 2017-09-11T03:10:00Z | 2017-09-11T04:07:59Z | 2017-09-11T03:20:00Z | 2017-09-11T04:09:10Z | 
| 1122 |  3 |  161 |  154 | 2017-09-11T03:10:00Z | 2017-09-11T05:51:23Z | 2017-09-11T03:20:00Z | 2017-09-11T05:54:22Z |