2013-08-23 4 views
1

Новый SQL-dev здесь. Я пишу приложение журнала вызовов для нашего сервера Asterisk. В одной таблице (CDRLogs) у меня есть журналы вызовов из телефонной системы (src, dst, calldate, duration). В другой таблице у меня есть (Employees) у меня есть empName, empExt, extStartDate extEndDate). Я хочу присоединиться к ним вместе на src и empExt на основе того, кто использовал конкретный ext в день вызова. Один пользователь на расширение в заданный временной интервал.SQL Join Statement, основанный на диапазоне дат

Например, у нас было 3 разных пользователя, сидящих на x100 в течение июля. В таблице «Сотрудники» я записал даты, когда каждый из этих людей начал работу, и закончил использование этого экземпляра. Как я могу присоединиться к этому объединению?

Заранее спасибо

+0

Какие СУБД вы используете? Каковы типы данных для 'calldate',' extStartDate', 'extEndDate'? –

+0

@Declan_K MSSQL 2008. Calldate - это datetime, а extStartDate и extEndDate - smalldatetime. – SouperGrover

ответ

0

Может быть что-то вроде:

SELECT A.*, B.* 
FROM CDRLOGS A 
INNER JOIN Employees B 
    ON A.SRC = B.EmpExt 
    AND A.CallDate between B.extStartDate and coalesce(B.extEndDate,getdate()) 

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

+0

Будьте очень осторожны с 'Between' на поля даты. Вы можете получить ошибки в зависимости от того, как обрабатывается переход от одного сотрудника к другому. –

+0

Очень верно, я предполагаю, что поля - это дата и не перекрывается; ни каких-либо пустот – xQbert

+0

@xQbert Это работает для меня до определенной степени. Одна задержка litle заключается в том, что если человек в данный момент сидит на этом экстенке (поэтому продление датируется пустым), их матчи не возвращаются. Как я могу сказать что-то вроде «if extenddate =» «then extenddate = today»? – SouperGrover