#c# #php #mysql #sql
#c# #php #mysql #sql
Вопрос:
Я написал 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')
Комментарии:
1. Это могло бы помочь нам понять ваше требование, если бы вы могли предоставить пример желаемого результата. Пожалуйста, отредактируйте свой вопрос, чтобы включить эту дополнительную информацию
2. Я привел пример. Надеюсь понять.
Ответ №1:
Обычно для проверки отсутствия записи (как вы делаете здесь для посещаемости, проверяя, что сотрудник не регистрировался в день) более эффективно использовать ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ и проверку на NULL в одном из полей в предложении WHERE (т. Е. Левое СОЕДИНЕНИЕ, в котором не найдено ни одной строки).).
Однако это также не даст вам дату.
Я предполагаю, что вы хотите проверить выбор дат, и для этого нужно просмотреть дату, когда они отсутствовали.
Таким образом, возможно, используйте серию объединенных простых запросов, чтобы получить даты, ПЕРЕКРЕСТНО ПРИСОЕДИНИТЕ их к вашей таблице employee и СЛЕВА ПРИСОЕДИНИТЕ их к таблице 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
Ответ №2:
Кажется, что вы фиксируете дни присутствия сотрудника в таблице ’empCheckInOut’.
Вам нужно создать временную таблицу со всеми датами, скажем, за 1 месяц, а затем за вычетом дат, которые записаны в таблице ’empCheckInOut’.
например, #temp будет иметь 06-01-2014, 06-02-2014, 06-03-2014, … (все 30 дней июня)
Проверка будет иметь 06-01-2014, 06-03-2014, … (2 июня emp отсутствует, поэтому здесь указано всего 29 дней июня)
Затем вычтите одно из другого, и вы получите даты, когда сотрудник отсутствует.