MySQL Query для автоматического заполнения постоянных событий в таблице без повторения процесса ввода - PullRequest
1 голос
/ 07 ноября 2019

Я использую MySQL дБ, и две таблицы называются «perm_events» для повторяющихся событий и «резервирования» для хранения отдельных событий, которые не повторяются, соответственно. Таблица perm_events существует с единственной целью - НЕ вводить одну и ту же информацию повторно. Это вопрос о "perm_events".

Например:

  • Событие A: Запланировано на каждое воскресенье, с 8:00 до 9:00 на неопределенное время.
  • СобытиеB: Запланировано на каждый вторник, четверг, с 1 декабря 2009 года по 12 декабря 2013 года.

Я использую PHP UI для сбора информации о событиях и хочу написать запрососновываться на информации, собранной из пользовательского интерфейса.

Информация собрана: (Это будет сохранено в таблице "perm_events".)

Event name: Event B
Location:   Rm. 1
Start time:  9:00AM
End Time:   10:00AM
Weekdays:   Tue, Thu
Start Date: 12/1/2019 (If NULL, the event is permanent)
End Date:   12/31/2019

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

   DATE    WKDAY EVENT NAME LOCATION STARTING_TIME ENDING_TIME 
---------- ----- ---------- -------- ------------- -----------
12/03/2019  TUE   EVENT B     Rm. 1    9:00AM        10:00AM
12/05/2019  THU   EVENT B     Rm. 1    9:00AM        10:00AM
12/10/2019  TUE   EVENT B     Rm. 1    9:00AM        10:00AM
12/12/2019  THU   EVENT B     Rm. 1    9:00AM        10:00AM   
                            .
                            . 
12/31/2019  TUE   EVENT B     Rm. 1    9:00AM        10:00AM

В настоящее время я ввожу событие ABOVE в виде серии событий на период с 12/3/2019 по 31/31/2019, как показано в интерфейсе, показанном ниже (нижеприведенные данные хранятся в таблице «бронирования»):

event_name: Event B(1)
location: Rm. 1
start_time: 9:00AM
end_time: 10:00AM
date: 12/3/2019
end_date: 12/31/2019
(Reserve Button)

После резервирования этого события я перейду к следующему, повторяя процесс до его завершения - как показано ниже.

event_name: Event B(2)
location: Rm. 1
start_time: 9:00AM
end_time: 10:00AM
date: 12/5/2019
end_date: 12/31/2019
(Reserve Button)
.
.
and so on...

Я быЯ должен делать этот, казалось бы, бесконечный процесс, пока процесс не завершится (я думаю, что в приведенном выше примере их 8 или 9). Более того, для постоянных событий, которые НЕ имеют КОНЕЦ ДАТЫ, мне придется постоянно вводить одну и ту же информацию о событии снова и снова.

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

Как мне это сделать?

Заранее благодарю всех экспертов, которые прочитают мой вопрос.

1 Ответ

0 голосов
/ 07 ноября 2019

Кит, я не кодер, так что это всего лишь доказательство концепции;

<?php

/* So let's say we store the days of the week as a bit integer, where 
   1 = Sunday, 2 = Monday, 4 = Wednesday, and 127 = everyday. For the 
   purposes of this example, I'm going to use Monday and Wednesday (2 and 8) which equals 10
*/

$weekday_bit = 10;

/*The following part is actually redundant if use the 'day' option of php's date() function, 
  but someone better at coding than me can show you how to do that...*/

$days = array('Sun','Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
$newdays = array(); //Initialise an array for storing the converted bit representation (so 'Mon','Wed', in this instance.

// Convert the bitwise integer to an array (Credit to Sammitch for this bit)

for( $i=0; $i<7; $i++ ) {
    $daybit = pow(2,$i);
    if( $weekday_bit & $daybit ) {
        $newdays[]=$days[$i];
    }
}

//And credit to HADI for what follows

function dateRange( $first, $last, $step = '+1 day', $format = 'Y-m-d' ) {
    $dates = array();
    $current = strtotime( $first );
    $last = strtotime( $last );

    while( $current <= $last ) {

        $dates[] = date( $format, $current );
        $current = strtotime( $step, $current );
    }

    return $dates;
}

$result = dateRange( '2019-11-01', '2019-11-31');

foreach($result as $v){
if(in_array(date('D', strtotime($v)),$newdays)){$x = 1;} else {$x = 0;}
echo $v." ".$x."<br>";
}

?>

Выводы, следующие, где «1» представляет каждый понедельник и среду ноября

2019-11-01 0
2019-11-02 0
2019-11-03 0
2019-11-04 1
2019-11-05 0
2019-11-06 1
2019-11-07 0
2019-11-08 0
2019-11-09 0
2019-11-10 0
2019-11-11 1
2019-11-12 0
2019-11-13 1
2019-11-14 0
2019-11-15 0
2019-11-16 0
2019-11-17 0
2019-11-18 1
2019-11-19 0
2019-11-20 1
2019-11-21 0
2019-11-22 0
2019-11-23 0
2019-11-24 0
2019-11-25 1
2019-11-26 0
2019-11-27 1
2019-11-28 0
2019-11-29 0
2019-11-30 0
2019-12-01 0
...