SQL-запрос для поиска по датам

#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 дней июня)

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