Я работаю с отметками времени и должен сделать внутреннее соединение, основанное на разнице времени. Я использую функцию 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;
Примечание:.. Вы можете использовать только 'DateDiff (с, [Atrium] [Дата2], [Sequoia] [theader_tdatetime]) между 0 и 5' вместо этого длинного оператора WHERE. Даже если вы используете некоторый интервал секунд (от 0 до 5), он уже может присоединиться более чем к 1 строке из таблицы «Sequoia». – gofr1
Я предполагаю, что по метке времени вы имеете в виду значение datetime? Будьте осторожны с вашими словами, поскольку timestamp - это тип данных в sql-сервере, который не имеет никакого отношения к времени суток. –
Почему вы используете все эти предикаты ИЛИ здесь? Почему бы просто не использовать диапазон, а не проверять одно и то же значение снова и снова? Вся ваша фраза where where может быть сведена к одному предикату. Несмотря на это, присоединение к датиффу, похожее на это, сильно подвержено ошибкам. У вас действительно должен быть лучший метод объединения строк, тогда предполагается, что даты близки. Это то, для чего предназначены внешние ключи. –