2015-07-14 3 views
1

Я работаю над проектом управления работой сотрудников, и я немного застрял. У меня есть 3 таблицы:Сотрудник доступен для задачи между диапазоном дат

 
1: employees 

    empid,  empFirst  empLast 
    1   jon   smith 
    2   mark   road 
    3   jane   hall 
 
2: holiday 

    id  employee id  datestart  dateend 
    1   2    2015-08-07  2015-08-12 
    2   3    2015-07-4  2015-07-11 
    3   2    2015-07-20  2015-07-24 
 
3: Task Assigned 

    id  taskid  assignedTo(userid)  startTask  endTask 
    1  1    1      2015-07-10  2015-07-14 
    2  2    2      2015-07-29  2015-07-29 
    3  2    3      2015-07-18  2015-07-30 
    4  3    2      2015-08-30  2015-09-03 
    5  4    2      2015-09-10  2015-09-03 

Я не уверен, как идти о запросе таблицы, чтобы увидеть, кто доступен для задачи в диапазоне дат (несколько пользователей, назначенных одной и той же задачи). У меня есть запрос, который я бы здесь:

так что если вы берете на праздничный стол, если уравнение и просто выполнить запрос ниже

SELECT employees.empId, employees.empFirst, employees.empLast 
FROM employees 
LEFT JOIN taskassigned 
ON employees.empId = taskassigned.assignedTo 
WHERE taskassigned.assignedTo IS NULL or 
not (taskassigned.startTask BETWEEN '2015-07-29 14:30:00' AND '2015-07-29 18:30:00' 
    or taskassigned.endTask BETWEEN '2015-07-29 14:30:00' AND '2015-07-29 18:30:00') 

В результате я получаю:

 
empId empFirst empLast 
1  jon  smith (he is available) 
2  mark  road  
2  mark  road 

Как вы можете видеть, Марк не доступен в эту дату (в таблице задач).

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

+0

Слишком устал, чтобы получить полный ответ, но попробуйте подумать об этом по-другому. Вы пытаетесь выяснить, свободен ли сотрудник между «2015-07-29 14: 30: 00» и «2015-07-29 18: 30: 00», поэтому в предложении 'WHERE' см., Если' 2015-07-29 14: 30: 00' не находится между 'taskassigned.startTask' и 'taskassigned.endTask', а если' 2015-07-29 18: 30: 00' не находится между 'taskassigned.startTask' и' taskassigned.endTask'. – Will

ответ

0

Я не могу проверить это на данный момент, но попробовать:

SELECT employees.empId, employees.empFirst, employees.empLast 
FROM employees 
LEFT JOIN taskassigned 
ON employees.empId = taskassigned.assignedTo 
LEFT JOIN holiday 
ON employees.empId = holiday.employeeId 
WHERE (
    taskassigned.assignedTo IS NULL 
    OR (
     '2015-07-29 14:30:00' NOT BETWEEN taskassigned.startTask AND taskassigned.endTask 
     AND '2015-07-29 18:30:00' NOT BETWEEN taskassigned.startTask AND taskassigned.endTask 
    ) 
) 
AND (
    holiday.employeeId IS NULL 
    OR (
     '2015-07-29 14:30:00' NOT BETWEEN holiday.dateStart AND holiday.dateEnd 
     AND '2015-07-29 18:30:00' NOT BETWEEN holiday.dateStart AND holiday.dateEnd 
    ) 
) 

Это проверить, если указанная дата начала не попадает между ними Поставленная задача в начальной или конечной даты, и если указанная дата окончания не падает между датой начала или окончания назначенной задачи, а затем делает то же самое для праздников.

+0

Привет, спасибо за ваш ответ, но это все еще не тот правильный результат, который я искал. все же получить отметку доступно, это потому, что у него есть другие заданные задачи. Я изменил начало праздника и формат конца до даты, а не timestamp, это имеет смысл. Но задача должна быть временной отметкой, потому что задача может занять всего 2 часа. Еще раз спасибо за ваше время ... –

+0

В результате я получаю emp 1 jon smith epm 2 mark road emp2 mark road epm 2 mark road emp 2 mark road, но знак не должен быть доступен снова спасибо –

+0

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

0

Привет У меня нет нужных инструментов, чтобы проверить прямо сейчас, но вот то, что вы можете попробовать сделать:

при использовании сравнения дат:

  • пытается конвертировать/ввергнуть в DATE (убедитесь, что время не включено), чтобы убедиться, что результат верен.

  • , насколько я знаю, при использовании между началом и окончанием также включен (возможно, в какой-то функции RDMS)

Также для включая праздник, что вы можете сделать, это так (или) :

  • сначала сначала присоединитесь к праздничной таблице, затем с результатом снова присоединитесь к заданной таблице задач.

или

  • первым присоединиться к задаче присваивается таблице, то в результате присоединиться снова с праздничного стола

Извините за код не включены, так как у меня нет времени для установки.

+0

, а вместо этого вы можете попробовать использовать><проверку, чтобы убедиться, что она работает. –

+0

Я изменил формат праздника на сегодняшний день, а не timestamp, задача все равно должна быть отметкой времени, потому что прихват может занять всего 2 часа. –

+0

Привет, новичок, вы можете включить код –