2016-10-04 1 views
0

Я работаю с отметками времени и должен сделать внутреннее соединение, основанное на разнице времени. Я использую функцию DATEDIFF, и, похоже, она работает хорошо. Однако время между метками времени меняется. Чтобы уточнить, иногда запись появляется в таблице 2 за ту же секунду, что и в таблице 1, а иногда запись в таблице 2 занимает до 15 секунд позади записи в таблице 1. Записи в таблице 1 всегда имеют временную отметку перед таблицей 2. Там не является другим общим полем, с которым я могу присоединиться, однако в каждой таблице есть номер регистра, который я использую, чтобы повысить точность, гарантируя, что регистры одинаковы.Внутренняя регистрация SQL Server с отметками времени: каждая запись назначается только один раз?

Мой вопрос: если я увеличиваю разницу временных интервалов, чтобы сделать внутреннее соединение (например, где DATEDIFF = 1 или 2 или 3 ... или 15) будут записываться только один раз? Или моя таблица содержит повторяющиеся записи из таблицы 1 (например, когда запись 1 соединяется с записью 4 в таблице 2, где разность составляет 4 секунды, а также соединена с записью 7 из таблицы 2, где разница составляет 11 секунд)?

Причина, по которой мое заявление работает сейчас, состоит в том, что никакие регистры не имеют записей с интервалом менее 6 секунд между ними, поэтому, даже если имеется несколько временных меток, совпадение регистров устраняет эту проблему.

Мое заявление в настоящее время работает как:

SELECT * 
INTO AtriumSequoiaJoin5 
FROM Atrium INNER JOIN Sequoia ON Atrium.Reader = Sequoia.theader_pos_name 
WHERE (
    ((DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=0 
    Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=1 
    Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=2 
    Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=3 
    Or (DateDiff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=4 
    Or (Datediff(s,[Atrium].[Date2],[Sequoia].[theader_tdatetime]))=5) 
    ) 
ORDER BY Sequoia.theader_id; 
+0

Примечание:.. Вы можете использовать только 'DateDiff (с, [Atrium] [Дата2], [Sequoia] [theader_tdatetime]) между 0 и 5' вместо этого длинного оператора WHERE. Даже если вы используете некоторый интервал секунд (от 0 до 5), он уже может присоединиться более чем к 1 строке из таблицы «Sequoia». – gofr1

+1

Я предполагаю, что по метке времени вы имеете в виду значение datetime? Будьте осторожны с вашими словами, поскольку timestamp - это тип данных в sql-сервере, который не имеет никакого отношения к времени суток. –

+0

Почему вы используете все эти предикаты ИЛИ здесь? Почему бы просто не использовать диапазон, а не проверять одно и то же значение снова и снова? Вся ваша фраза where where может быть сведена к одному предикату. Несмотря на это, присоединение к датиффу, похожее на это, сильно подвержено ошибкам. У вас действительно должен быть лучший метод объединения строк, тогда предполагается, что даты близки. Это то, для чего предназначены внешние ключи. –

ответ

2

можно CROSS ОТНОСИТЬСЯ к ближайшей записи в близости. Но это ни в коем случае не идеально, что, если в то же время написано несколько записей? Вы, возможно, должны дать первой таблицы в поле идентификатора, а затем обновить следующую таблицу с scopeidentity

SELECT * 

INTO AtriumSequoiaJoin5 

FROM Atrium CROSS APPLY 
    (SELECT TOP 1 * FROM Sequoia WHERE 
      Atrium.Reader = Sequoia.theader_pos_name 
      ORDER BY Datediff(millisecond,[Atrium].[Date2],[Sequoia].[theader_tdatetime])) DQ 

ORDER BY Sequoia.theader_id; 
+0

Я думаю, что это должно работать, потому что единственные записи, которые записываются одновременно, происходят в разных регистрах и устраняются путем сопоставления Atrium.Reader = Sequoia.theader_pos_name. –

Смежные вопросы