Проблема заключается в том, что для правильной работы SQL необходимо определить 5-минутный запас более жестко. Если вы хотите быть нечетким, тогда SQL - не тот язык.
Что если 2 результата в таблице А находятся в пределах 5 минут друг от друга? Они оба присоединяются к одной и той же записи в таблице B? Затем вы получаете дублированные записи.
То, что вы хотите сделать, это bin ваши даты в 5-минутных сегментах (или что вы выберете), используя план округления вниз / вверх. Предварительно созданная таблица поиска всегда является быстродействующим решением, которая будет содержать столбец индекса каждой минуты каждого дня и другой столбец с согласованными 5-минутными сегментами. Эта промежуточная таблица может использоваться для соединения таблицы A с таблицей B.
т.е. LookupTable (простите за форматирование!)
LookupTime _ __ _ __ _ __ _ BucketTime
2013-01-01 14:56 _ ____ 2013-01-01 14: 55
2013-01-01 14: 57_ _ ___ 2013-01-01 14: 55
2013-01-01 14: 58_ _ ___ 2013-01-01 15: 00
2013-01-01 14: 59_ _ ___ 2013-01-01 15: 00
Вы бы присоединили таблицу Date к описанному выше LookupTime.
Вы бы сделали отдельное соединение со второй копией таблицы LookupTime для tableB,
Затем соедините две копии таблицы поиска друг с другом в поле BucketTime.
Сложная часть заключается в согласовании округления, которое вы будете использовать. Я рекомендую "Round To Even", который сглаживает смещение округления вверх, которое идет с цифрами округления 1-4 вниз и 5-9 вверх.