Я написал SQL-запрос, который ищет в таблице ПРИСУТСТВИЯ отсутствующих лиц. Но как мне показать даты, я имею в виду дату отсутствующего периода? Работает нормально кроме даты. Я хочу показать, какой день этого периода отсутствия? Я не могу показать дату.

Образец:

BadgeNumber - EmployeeName - Absent Date
10042 - Mr. Erik - 2014-07-01

Код:

SELECT  SMEmployee.BadgeNumber,SMEmployee.EmployeeFullName,SMDepartment.DepartmentName
    FROM SMEmployee
    LEFT OUTER JOIN SMDepartment 
    ON SMDepartment.DepartmentID=SMEmployee.DepartmentID    
    WHERE EmployeeID NOT IN (
    SELECT empCheckInOut.USERID 
    FROM empCheckInOut 
    WHERE convert(date,CHECKTIME)='2014-07-01')
4
TechView 1 Июл 2014 в 14:47
1
Если бы вы могли предоставить пример желаемого результата, это могло бы помочь нам понять ваше требование. Пожалуйста, отредактируйте свой вопрос, чтобы включить эту дополнительную информацию
 – 
musefan
1 Июл 2014 в 14:48
Я дал образец. Надеюсь понять.
 – 
TechView
1 Июл 2014 в 15:02

2 ответа

Лучший ответ

Обычно для проверки отсутствия записи (как вы делаете здесь для присутствия, проверяя, что сотрудник не приходил / уходил в течение дня) более эффективно использовать LEFT OUTER JOIN и проверку на NULL в одном полей в предложении WHERE (т. е. LEFT JOIN, где не найдено ни одной строки).

Однако это также не даст вам дату.

Я предполагаю, что вы хотите проверить выбор дат, и для этого нужно вытащить дату, когда они отсутствовали.

Таким образом, можно использовать серию объединенных простых запросов для получения дат, CROSS JOIN для вашей таблицы сотрудников и LEFT JOIN для таблицы empCheckInOut. Таким образом вы можете поставить дату.

SELECT  SMEmployee.BadgeNumber,SMEmployee.EmployeeFullName,SMDepartment.DepartmentName, subDate.aDate
FROM SMEmployee
CROSS JOIN (SELECT '2014-07-01' AS aDate UNION SELECT '2014-06-30') subDate
LEFT OUTER JOIN SMDepartment 
ON SMDepartment.DepartmentID=SMEmployee.DepartmentID    
LEFT OUTER JOIN empCheckInOut
ON SMEmployee.EmployeeID = empCheckInOut.USERID 
AND convert(date,CHECKTIME) = subDate.aDate
WHERE empCheckInOut.USERID IS NULL
0
Kickstart 1 Июл 2014 в 15:12

Кажется, вы фиксируете количество дней, в течение которых сотрудник присутствует в таблице empCheckInOut.

Вам нужно построить временную таблицу со всеми датами, скажем, 1 месяц, а затем минус даты, которые записаны в таблице empCheckInOut.

Например #temp будет 06-01-2014, 06-02-2014, 06-03-2014, ... (все 30 дней июня)

CheckInOut будет иметь 06-01-2014, 06-03-2014, ... (2 июня emp отсутствует, поэтому здесь зафиксировано всего 29 дней июня)

Затем вычтите одно из другого, и вы получите даты, когда сотрудник отсутствует.

0
CleanBold 1 Июл 2014 в 15:03