Перекрестное соединение SQL ограничено датами в пределах 7 дней друг от друга

Я хотел бы выполнить перекрестное соединение, но сохранить только пары записей, которые находятся в пределах 7 дней друг от друга. Мой код ниже сохраняет пары с точно такой же датой. Как его можно изменить, чтобы разрешить даты в течение 7 дней? Я использую SQL Server 2008.

SELECT 
t1.[id] AS [A_id],
t2.[id] AS [B_id],
t1.[date] AS [A_date],
t2.[date] AS [B_date],
t1.[item] AS [A_item],
t2.[item] AS [B_item],
INTO [records_crossed]
FROM [records] t1
CROSS JOIN [records] t2
WHERE 
t1.[date]=t2.[date]
ORDER BY t1.[id],t2.[id]

person user2964644    schedule 01.02.2016    source источник
comment
Проверьте ПЕРЕКРЫТИЯ. (Кстати, переключитесь на INNER JOIN ... ON вместо перекрестного соединения...   -  person jarlh    schedule 01.02.2016
comment
Используемые базы данных тегов. (Слишком много продуктов далеки от совместимости с ANSI SQL, когда речь идет о дате/времени.)   -  person jarlh    schedule 01.02.2016
comment
Ярл прав. Ваше перекрестное соединение на самом деле не является перекрестным соединением. Это запутанное внутреннее соединение   -  person a_horse_with_no_name    schedule 01.02.2016
comment
Возможный дубликат Разница двух дат и времени на сервере sql   -  person Tab Alleman    schedule 01.02.2016


Ответы (2)


Как вы выражаете такое соединение, не так важно. По сути запрос:

SELECT . . .
INTO [records_crossed]
FROM [records] t1 JOIN
     [records] t2
     ON ABS(DATEDIFF(DAY, t1.[date], t2.[date])) <= 7
ORDER BY t1.[id], t2.[id];

Это создаст повторяющиеся инверсии (те же две записи в другом порядке) и одну и ту же запись. Если вам не нужны такие записи:

SELECT . . .
INTO [records_crossed]
FROM [records] t1 JOIN
     [records] t2
     ON DATEDIFF(DAY, t1.[date], t2.[date]) BETWEEN 0 AND 7 AND
        t1.id <> t2.id
ORDER BY t1.[id], t2.[id];
person Gordon Linoff    schedule 01.02.2016

Это даст то, что вам нужно, и позволит использовать ИНДЕКС на [records].[date], если он есть.

SELECT 
    t1.[id] AS [A_id],
    t2.[id] AS [B_id],
    t1.[date] AS [A_date],
    t2.[date] AS [B_date],
    t1.[item] AS [A_item],
    t2.[item] AS [B_item],
INTO 
    [records_crossed]
FROM 
    [records] t1
    INNER JOIN [records] t2 ON
        t2.[date] BETWEEN DATEADD(DAY,-7,t1.[date]) AND DATEADD(DAY,+7,t1.[date])
ORDER BY 
    t1.[id],
    t2.[id];
person TT.    schedule 01.02.2016