Очень немногие (если вообще есть) базы данных имеют дело с диапазонами дат как с типом данных, и хотя существуют способы расчета пересечений диапазонов дат, они являются дорогостоящими и заставят сканировать любые большие наборы данных. таким образом, вам нужно обменять скорость вычислений на хранение данных
из-за этого лучший способ проверить - это иметь таблицу, в которой хранятся даты, а затем использовать даты в этой таблице, чтобы раздуть ваши диапазоны дат до всех дат внутри диапазона, структура проста, всего один столбец с датой в нем
я бы не предложил использовать таблицу дат для отслеживания праздников, вместо этого просто включите их как отсутствие типа «Праздничный день», вы можете отметить выходные (или какой это день недели) в таблице дат, но не используйте это чтобы сказать, работал ли человек или не работал в тот день, вместо этого используйте таблицу workPattern, в которой указано, что сотрудник типа factory worker
работает 4 часа в понедельник, 6 часов во вторник. это даст вам ожидаемое рабочее время сотрудников и дни, в которые они должны работать в течение недели, не заставляя каждого сотрудника следовать одному и тому же рабочему графику.
eg
select d.Date, a.*
from absence as a
join dates as d on d.Date between a.StartDate and a.EndDate
это даст вам каждую дату отсутствия человека, что позволит вам очень легко сравнить разные периоды отсутствия вместе
большинство систем найма редко позволяют сотрудникам работать более чем на год вперед, поэтому я бы предложил иметь ежемесячное задание, которое запускается и заполняет таблицу дат всеми датами между (Today + 12 months)
и (Today + 13 months)
, вы также можете удалить старые даты но перед этим убедитесь, что нет обстоятельств, при которых вам нужно будет запрашивать данные. т.е. все до минимальной даты вашего отъезда было заархивировано.
Следующее, что нужно иметь в виду, это человеческий фактор, люди будут забывать приходиться или уходить, поэтому вам нужно помнить об этом и иметь ежедневную работу, которая ищет приходы без соответствующих часов или наоборот, тогда вы может либо пометить их для исправления человеком, либо справиться с ними автоматически
после того, как вы отсортируете эти два элемента, вы можете рассчитать количество отработанных часов каждого человека в день, перекрестно соединить это с представлением ежедневного отсутствия, что позволит вам проверить несоответствие, например, даты в таблице дат, которые не имеют часов или отсутствие (несанкционированное отсутствие), которое можно исправить с помощью соответствующих записей в таблице отсутствия или конфликтов, например, кто-то приходит на работу, когда он должен был быть в отпуске, опять же, вы можете пометить человеческое исправление или обрабатывать автоматически, скажем, если часы присутствуют игнорировать отсутствие
То, как вы на самом деле строите свою систему, зависит от того, что вам нужно в ваших системах, но это общие факторы, которые убьют вашу систему, если вы не примете их во внимание.
person
MikeT
schedule
25.07.2016
calendar
— использовать ее в качестве календаря в вашей программе. - person Ivan Starostin   schedule 25.07.20162016-07-25 - holiday
,2017-07-25 - not holiday
кто на кого влияет? Год спустя кто-то скажет знаете, мне не понравилась эта вечеринка, допустим, это был не праздник?.. - person Ivan Starostin   schedule 25.07.2016active dates
в этом случае? - person Ivan Starostin   schedule 25.07.2016