使用Y / m / d按月组织帖子列表

时间:2014-01-07 21:12:33

标签: php mysql datetime

我正在制作博客,我希望能够根据帖子的添加日期过滤结果。这些帖子的日期时间格式为2013-11-15 04:08:03。现在我想点击几个月的列表,所以让我说我点击11月它应该显示11月的所有帖子,但我不确定如何从上面的时间中提取月份然后将其添加到查询中。

到目前为止我所得到的是几个月的清单。你选择一个月份通过月份的数值,即1月= 01.现在一切正常,我可以回应它在网页上工作,但我怎么把它与Y / m /链接d以便01选择01月的所有条目?

我认为这会像选择所有m =所选月份(m是y / m / d中的m)。

1 个答案:

答案 0 :(得分: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'] . '">' . $row['title'] . '</a>';
# <a href="....?month=201311">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');