Как получить данные за предыдущий месяц из базы данных в php?

Я занимаюсь разработкой веб-сайта php и вам нужно получить некоторые данные за предыдущий месяц. Не только данные за предыдущий месяц, но и последние пять месяцев. И я смущен, что как я могу это сделать? В моей базе данных я создал два столбца. Один – «Месяц», а другой – «Год». Так что строка будет выглядеть так:


id —- текст —- месяц —- год

1 —- привет —- Май —– 2014

2 —- hi —- Май —– 2014


Теперь я могу получить данные, используя функцию date (), подобную этой.

$first_month = date('F', strtotime('-1 month')); $second_month = date('F', strtotime('-2 month')); $third_month = date('F', strtotime('-3 month')); 

за пять месяцев я могу создать пять переменных. Но на год? Я имею в виду, если текущий месяц – январь и 2014 год, то мне нужно будет получить данные с декабря 2013 года, так как это будет работать? Кто-нибудь может мне предложить?

Я так растерялся. Скажите, пожалуйста, если кто-то сделал что-то подобное раньше. Мне нужна идея или концепция.

Вы можете либо перестроить свои таблицы, чтобы использовать временную метку Unix, либо date MySQL, и выбрать с помощью компаратора. Или вы можете создавать временные таблицы и делать то же самое.

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

Изменить: Чтобы сохранить текущую логику, оператор SQL Select должен быть серией WHERE s. Например:

 SELECT * FROM table WHERE (month IN ('April', 'May') AND year = 2014) 

Выберет месяцы апреля и мая в 2014 году.

Следующие будут охватывать год:

 SELECT * FROM table WHERE (month IN ('December') AND year = 2013) OR (month IN ('January') AND year = 2014) 

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

Структура такого массива будет выглядеть так:

 // For the first example $where1 = array( 2014 => array( 'April', 'May' ) ); // For the second example $where2 = array( 2013 => array( 'December' ), 2014 => array( 'January' ) ); 

И вам придется создать предложение WHERE из этих массивов. Такие как:

 /** * Outputs * [where1] (month IN ('April', 'May') AND year = 2014) * * [where2] (month IN ('December') AND year = 2013) OR (month IN ('January') AND year = 2014) */ foreach(array('where1','where1') as $where_name) { $clause = ''; $where = $$where_name; $wheres = array(); foreach($where as $year => $months) { $wheres[] = "month IN ('" . implode("', '", $months) . "') AND year = $year"; } $clause = '('.implode (') OR (', $wheres).')'; echo "[$where_name] $clause\n\n"; } 

Это должно делать свое дело. Здесь есть рабочий пример. Сбор списка месяцев почти такой же, как вы делали, но moreso вроде так:

  list($month, $year) = explode(" ", date('F Y', strtotime('-3 month'))); var_dump($month); // February var_dump($year); // 2014 $array[$year][] = $month; // Will create the array structure as above в  list($month, $year) = explode(" ", date('F Y', strtotime('-3 month'))); var_dump($month); // February var_dump($year); // 2014 $array[$year][] = $month; // Will create the array structure as above в  list($month, $year) = explode(" ", date('F Y', strtotime('-3 month'))); var_dump($month); // February var_dump($year); // 2014 $array[$year][] = $month; // Will create the array structure as above 

Есть более эффективные способы, но это общая идея. По-моему, я оставил вас с интересными инструментами для решения вашей проблемы.

Чтобы это попало в диапазон, вам нужно будет что-то сделать в соответствии с:

 $where3 = array(); for ($prev_months = 1; $prev_months <= 5; $prev_months++) { list($month, $year) = explode(" ", date('F Y', strtotime("-$prev_months month"))); $where3[$year][] = $month; } 

Вы можете посмотреть рабочий пример здесь: http://ideone.com/UWI5wI

Для справки, вот примеры использования вашей методологии против принятой нормы:

 // your last and 5 (month IN ('April', 'March', 'February', 'January') AND year = 2014) OR (month IN ('December') AND year = 2013) // native 1 and 5 date <= 2014-05-01 01:00:00 AND date > 2013-12-01 01:00:00 

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

Разница гораздо более очевидна, если охватывать ДЛИННЫЕ периоды времени:

 // 2 years, yours (month IN ('April', 'March', 'February', 'January') AND year = 2014) OR (month IN ('December', 'November', 'October', 'September', 'August', 'July', 'June', 'May', 'April', 'March', 'February', 'January') AND year = 2013) OR (month IN ('December', 'November', 'October', 'September', 'August', 'July', 'June', 'May') AND year = 2012) // The conventional way is still just two comparators... 

формат даты MySQL – ГГГГ-ММ-ДД ЧЧ: ММ: СС

или (чтобы получить формат даты за месяц назад):

 date("Ymd H:i:s",strtotime("-1 month")); 

Вы должны создать столбец созданного (timestamp / datetime) новых данных и просто выполнить поиск по этим данным.

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

Если вы хотите сохранить свою структуру таблицы, вы можете использовать то, что у вас есть:

 $month = date('F', strtotime('-6 month')); $year = date('Y', strtotime('-6 month')); 

Принесут вам ноябрь и 2013 год

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

имя таблицы: year_2014

  id----m1---m2---m3 etc... 1----hello 2----hi 3----Hey 

Тогда ваш запрос будет выглядеть следующим образом:

 $month = date("n", strtotime('-6 month')); $year = date('Y', strtotime('-6 month')); $monthval = "m" + $month; $SQL = "SELECT " . $monthval . " FROM year_".$year; SELECT m11 FROM year_2013