Я написал 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')
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
Кажется, вы фиксируете количество дней, в течение которых сотрудник присутствует в таблице empCheckInOut.
Вам нужно построить временную таблицу со всеми датами, скажем, 1 месяц, а затем минус даты, которые записаны в таблице empCheckInOut.
Например #temp будет 06-01-2014, 06-02-2014, 06-03-2014, ... (все 30 дней июня)
CheckInOut будет иметь 06-01-2014, 06-03-2014, ... (2 июня emp отсутствует, поэтому здесь зафиксировано всего 29 дней июня)
Затем вычтите одно из другого, и вы получите даты, когда сотрудник отсутствует.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.