http://www.bioshapebenefits.nl/bioshapebenefits/en/news/donations.html
如您所见,这里有一长串条目,按日期排序,非常简单。因此,在mysql中,只有列'name'和'date',例如。如果我想用php创建一个列表,这也很简单,只需按日期排序。
但是我如何将月份和年份放在两者之间,如示例所示?像:
2010年6月
2010年5月
答案 0 :(得分:5)
在SQL Server中,它将如下所示,我想想mysql有类似的东西:
GROUP BY Year(Date), Month(Date)
答案 1 :(得分:5)
有十几种方法来修饰这只猫,但我的方法可能就是这样(所有粗略的代码片段,而不是完整的实现)
首先是查询
select `name`
, month(`date`) as date_month
, year(`date`) as date_year
from [Table]
order by `date` desc
然后,将数据组织到所需的逻辑组
$templateData = array();
foreach ( $rows as $row )
{
$templateData[$row->date_year][$row->date_month][] = $row->name;
}
然后,在模板中
<?php foreach ( $templateData as $year => $months ) : ?>
<?php foreach ( $months as $month => $names ) : ?>
<h2><?php echo $month, ' ', $year; ?></h2>
<ul>
<?php foreach ( $names as $name ) : ?>
<li><?php echo $name; ?></li>
<?php endforeach; ?>
</ul>
<?php endforeach; ?>
<?php endforeach; ?>
答案 2 :(得分:1)
我们做本月分组的吨位。我使用这个表达式将任意时间戳截断为代表本月第一天的时间戳。
TIMESTAMP(DATE_FORMAT(action_time,'%Y-%m-01'))
这与Oracle-ism TRUNC(action_time,'MM')
例如你可以做
SELECT COUNT(*) NUM, TIMESTAMP(DATE_FORMAT(t.action_time,'%Y-%m-01')) MONTH
FROM TABLE t
GROUP BY TIMESTAMP(DATE_FORMAT(t.action_time,'%Y-%m-01'))
这具有概念上的优势,即它可以保持月截断数据的时间戳,因此如果需要,您仍然可以根据需要计算时差并执行其他时间和日期的事情。
正如ravern指出的那样,性能会受到很小的惩罚(但也不错!)。我们的一些表列是使用此函数加载的,因此它们已被截断月份。