Запрос даты и отображение - PullRequest
0 голосов
/ 03 октября 2009

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

Я хочу отображать запросы на отключение для данной недели (пн-пт). У меня есть запросы в таблице «запросы», с «Starttime» и «Endtime» в отдельных полях, оба Date / Time.

В настоящее время я могу легко искать и извлекать запросы, которые имеют (или оба) значения Starttime или Endtime, которые находятся в пределах данной недели ISO, которую я просматриваю (WEEKOFYEAR ()).

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

Пример:

  1. Сотрудник вылетает со вторника недели 24 по пятницу недели 24.

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

  2. Сотрудник вылетает с пятницы 30-й недели по понедельник 32-й недели.

    В настоящее время я бы показал, что этот сотрудник не был «выключен» в течение 31 недели, потому что поиск не показывал время начала или окончания в течение этой недели, даже если он фактически не работал всю неделю. Хотя время начала и время окончания будут отмечены в правильные дни.

Прямо сейчас, чтобы обойти это, я запускаю 5 дополнительных запросов, чтобы проверить, содержится ли дата каждого дня с понедельника по пятницу в течение 31 недели МЕЖДУ временем начала и окончания каждого запроса в БД.

Я ненавижу запускать в общей сложности 6 запросов, чтобы получить эту информацию. Есть ли более простой способ получить эту информацию?

Ответы [ 5 ]

1 голос
/ 03 октября 2009

Я только что написал приложение для календаря для событий и столкнулся с этим - как насчет этого:

SELECT * FROM Requests WHERE 
Start_Date BETWEEN <first_day_of_week> AND <last_day_of_week>
OR
End_Date BETWEEN <first_day_of_week> AND <last_day_of_week>
OR
<day_of_week_monday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_tuesday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_wedenesday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_thursday> BETWEEN Start_Date AND End_Date
OR
<day_of_week_friday> BETWEEN Start_Date AND End_Date
GROUP BY ID ORDER BY Start_Date ASC, Date ASC

Хотя генерируются с php через просматриваемую в настоящее время неделю, запрошенную Должен охватывать ваши базы.

0 голосов
/ 03 октября 2009

Вероятно, запрос должен быть прочитан как большой со всеми ORs или как-то так:

WHERE 
Starttime <= <value for last day/time of the week> 
AND
Endtime >= <value for the first day/time of the week>

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

0 голосов
/ 03 октября 2009

, так как вы упомянули PHP как дисплей:

$start=30; //Friday of Week 30
$end=32; //Monday of Week 32

foreach (range($start, $end) as $number) {
    echo $number;
}

Вы ожидаете получить 30,31,32.

Вы должны будете убедиться, что $ start составляет <$ end, хотя и в период с декабря по январь. </p>

Диапазон значений WEEKOFYEAR () составляет 1-53. В этом случае добавьте 53 к $ end и отобразите мод $ end, если он больше 53:

$start=52; //Friday of Week 52, 2009
$end=2; //Monday of Week 2, 2010

If($start>$end) $end+=53;
foreach (range($start, $end) as $number) {
    if($number>53){
        echo $number%53;}
    else{
        echo $number;
    }
}

Вы ожидаете получить 52,53,1,2

0 голосов
/ 03 октября 2009

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

SELECT * FROM table WHERE WEEKOFYEAR(Starttime) <= N AND WEEKOFYEAR(Endtime) >= N;

(где N - неделя, которую вы отображаете)

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

Хороший метод для этого - использовать:

$start_timestamp = strtotime($row['Starttime']);
$end_timestamp = strtotime($row['Endtime']);

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

0 голосов
/ 03 октября 2009

В каком формате хранятся эти даты в БД? Предполагая, что они используют MySQL DATE , это довольно легко сделать. Вы можете просто использовать операторы сравнения в полях, и MySQL сделает всю работу за вас в одном запросе.

$sql = "SELECT * FROM table WHERE startdate <= $someday AND $someday <= enddate";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...