Организовывать списки сообщений по месяцам с использованием Y/m/d

Я делаю блог, и я хочу иметь возможность фильтровать результаты в зависимости от даты добавления сообщения. Сообщения имеют дату и время в формате 2013-11-15 04:08:03. Теперь я хочу щелкнуть по списку месяцев, поэтому позвольте сказать, что я нажимаю ноябрь, он должен показывать все записи в ноябре, но я не уверен, как я извлечу месяц из указанного выше времени, а затем добавлю это к запросу.

То, что у меня осталось, - это список месяцев. Вы выбираете месяц, который передает числовое значение месяца, то есть январь = 01. Теперь, когда все работает, и я могу повторить, что он работает на сетевой странице, но как мне связать это с Y/m/d, так что 01 выбирает все записи с 01-м месяцем?

Я думал, что это будет что-то вроде выбора всего, где m = выбранный месяц (m - m в Y/m/d).

1 ответ

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

SELECT
 DATE_FORMAT('date_field', '%Y%m') AS 'id',
 DATE_FORMAT('date_field', '%M %Y') AS 'title'
FROM 
 'posts_table'
GROUP BY 
 DATE_FORMAT('date_field', '%Y%m')
ORDER BY 
 'date_field' DESC

Когда вы получаете этот год-месяцев, создайте ссылки с id полученным из предыдущего запроса, например:

echo '<a href="....?month=' . $row['id'] . '" target="_blank">' . $row['title'] . '</a>';
# <a href="....?month=201311" target="_blank">November 2013</a>

И когда пользователь приземлится на эту ссылку, выберите параметр GET и выберите все сообщения за этот месяц:

SELECT *
FROM 'posts_table'
WHERE DATE_FORMAT('date_field', '%Y%m') = ?

Где ? должен быть выбран месяц, например, 201311. Но если у вас есть указатель на date_field, вы должны использовать BETWEEN чтобы индекс был применен:

$selected = '201311';
$from = new DateTime("{$selected}01");

$sql = "
 SELECT *
 FROM 'posts_table'
 WHERE 'date_field' BETWEEN ? AND ?
";
// first ? should be $from->format('Y-m-d 00:00:00');
// second ? should be $from->format('Y-m-t 23:59:59');

licensed under cc by-sa 3.0 with attribution.