SQL запрос, временной интервал - PullRequest
0 голосов
/ 19 июня 2020

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

Это также должно найти людей, которые были там хотя бы какое-то время в течение этого промежутка времени.

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

У меня есть следующее. Но он просто выдаст мне тех, кто был там после времени начала ($time_from) и ушел до времени окончания ($time_to).

$SQL_String = mysqli_query ($con, "
    SELECT * 
      FROM log 
     WHERE users_name = '" . $username . "' 
       AND login_time >= '" . $time_from . "' 
       AND logout_time <= '" . $time_to . "' 
     ORDER 
        BY dateandtime ASC
    "); 

login_time и logout_time - время начала и окончания в базе данных для пользователя. В то время как $time_from и $time_to - время начала и окончания, как указано в форме.

Если я буду искать в эти часы;

10: 00 - 12: 00

  • Следует засчитать участника, у которого были эти часы. 9:00 - 10: 05
  • Участник, у которого были эти часы, должен быть посчитан. 10:05 - 11:45 Следует посчитать участников, у которых были эти часы. 11:00 - 12: 05
  • Следует посчитать участника, у которого были эти часы. 9:00 - 13:00

Вкратце:

Мне нужно найти, кто работал в данный период времени. Неважно, были ли они там весь день, опаздывали или уезжали рано - были ли они там в течение времени, указанного в форме.

Вы можете мне помочь с этой проблемой ?? Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Вы хотите любое перекрытие. Это будет:

select l.*
from log l
where l.login_time < $time_to and
      l.logout_time > $time_from;

logi c - довольно простой таймфрейм A перекрывается с таймфреймом B, если A начинается до окончания B, а A заканчивается после начала B.

0 голосов
/ 20 июня 2020

У вас есть 3 случая:

  • Лицо, прибывающее в заданный период времени
  • Лицо, уезжающее в заданный период
  • Лицо, прибывшее раньше, уходящее по истечении

Теперь объедините что-то вроде этого:

where 
(arrival >= starttime AND arrival <= endtime) 
OR 
(departure >= starttime AND arrival <= endtime) 
OR
(arrival <= starttime AND departure >= endtime)

Да, кстати, ваш sql открыт для sql фильтруемости инъекций. Никогда не используйте переменные непосредственно в sql строках.

...