2015-04-15 3 views
2

Comment puis-je autoriser une tolérance de 1 à 10 secondes?Comment joindre des colonnes d'horodatage avec tolérance

J'ai deux tables qui ont des horodatages, mais qui sont désactivées de 1 à 10 secondes. J'utilise la jointure interne pour les comparer. J'ai des numéros de téléphone (colonnes) dans les deux tableaux qui correspondent, mais je ne peux pas les faire correspondre avec les horodatages (temps seulement). Pour permettre une certaine tolérance, je pourrais utiliser une expression comme cast(DateCreated as Time) = cast(TIMESTAMP as time) + 5. Mais je ne veux pas faire ça pour chaque seconde.

SELECT Time_To_Sec(cast("table1_DateCreated" as time)) as DateCreated 
    , Time_To_Sec(cast("table2"."Timestamp" as time)) as Timestampe 
    , "Direction","FromTW", "ToTW", "table2"."ANI","table2"."CALL ID" 
    , "table2"."Disposition" 
FROM "calls and time" 
INNER JOIN "table2" on cast(DateCreated as Time)=cast(TIMESTAMP as time)+5 
        and FromTW="table2"."ANI" 

Je voudrais voir les résultats suivants si possible:

table1(DateCreated) | table2(Timestamp) | compared results 
---------------------+---------------------+----------------- 
5000     | 5005    | table3 
5001     | 5009    | table3 
5001     | 5050    | not in table3 

Si la condition est remplie, alors il sera envoyé au tableau 3 mais si ne répond pas à la condition plus il ne sera pas En utilisant les rapports Zoho, je ne sais pas quel type de base de données ils utilisent. Postgres, MySQL, etc.

+1

Postgres ou MySQL? Cela ne peut pas être les deux en même temps. –

+0

Je ne sais pas quel rapport ZOHO aime le plus mais mysql travaille la plupart du temps. permet d'essayer Mysql –

Répondre

2

Si horodatages les deux tables peuvent être off by 1-10 seconds, il suit logiquement que la tolérance maximale pour un match est 20 sceonds (+/- 10 de chaque côté).

Testés dans Postgres:

SELECT * 
FROM "calls and time" t1 
JOIN table2 t2 ON t2."TIMESTAMP" BETWEEN t1."DateCreated" - interval '20 sec' 
             AND t1."DateCreated" + interval '20 sec'; 
WHERE t1."FromTW" = t2."ANI" -- FromTW or "FromTW" ? 

Ceci est une expression sargable qui permet d'utiliser un index sur x:

x BETWEEN y - interval '20 sec' 
     AND y + interval '20 sec' 

"calls and time", "TIMESTAMP", "FromTW" sont identifiants extrêmement malheureux, BTW S'en tenir à des noms juridiques, sans guillemets pour éviter des problèmes.

0

Vérifiez la différence absolue des deux horodatages, which'd être en pseudo-code:

if (abs($timestamp1 - $timestamp2) <= $tolerance) { ... } 
+0

je vois la logique. je vais l'essayer. –