我需要显示按日期分组的记录,并按时间排序。在mysql表中,我有一个名为entry_time
的字段,其中存储了php time()
值。什么是最简洁,最简单的方法呢?
Ex:我需要一个像:
这样的显示器21st April
3:00 pm
3:50 pm
22 April
5:00 am
4:00 pm
答案 0 :(得分:2)
粗半伪代码:
$records = /* SELECT * FROM `records` ORDER BY `entry_time` */;
$date = null;
foreach ($records as $record) {
$currentDate = date('Ymd', $record['entry_time']);
if ($currentDate != $date) {
printf('<h1>%s</h1>', date('Y-m-d', $record['entry_time']));
}
$date = $currentDate;
echo date('H:i', $record['entry_time']);
}
答案 1 :(得分:1)
如果您正在使用PHP处理查询结果,请考虑编写一个简单的查询来按日期对记录进行排序:
SELECT NameOfMyThing, MyDateField FROM MyTable ORDER BY MyDateField DESC
然后使用PHP来阅读结果:
$last_day = '';
while ($row = $query_result->fetch()) {
$date = new DateTime($row->['MyDateField']);
$day = $date->format('j F'); // '9 April'
$time = $date->format('g:i a'); // '9:05 am'
if ($day != $last_day) {
print $day . "\n";
$last_day = $day;
}
print $time . " " . $row->['NameOfMyThing'];
}
这里的想法是记住你看到的最后一天,只输出日期变化的日期。
(未经测试的代码,仅针对可读性进行了优化)。
答案 2 :(得分:0)
拥有多维数组。
$datetime = array("April 21st" => array("5:00a.m", "4:00p.m"), "April 22nd" => array(...));
然后您可以分别根据日期和时间进行排序。
答案 3 :(得分:0)
当您在数据库中存储time()
时,最简单的方法是:
time()
按列对表进行排序。date()
两次:一天一个月,一个一小时。保存上次使用的日期,如果它们相同,请将下一次放入相同的数组元素(我假设您使用LainIwakura存储此类数据的解决方案)。答案 4 :(得分:0)
像这样的SQL查询(使用wordpress作为示例)将以正确的顺序获取记录,并具有正确的格式:
select date_format(post_date, "%d %b") as day, date_format(post_date, "%T") as time from wp_posts;
然后,您可以遍历此数组,并在第一列更改时开始新的“日期”标题。
我真的不建议按照@Lainlwakura的评论建议一次查询db一行 - PHP很慢,迭代单行查询很慢。 PHP数组排序,尤其是字符串键的排序速度令人难以置信。如果您列出的是一年左右的记录,那么这种方法将无效。
让mysql为你做的尽可能多。
答案 5 :(得分:0)
我可能认为太容易了,但猜猜可以用:
SELECT DATE(`datefield`) `date`, TIME(`datefield`) `time` FROM `yourtable` ORDER BY `datefield` ASC;
然后用PHP显示它。 MySQL仅用于获取数据,而不是用于显示数据。 :)
答案 6 :(得分:0)
查询:
SELECT DATE_FORMAT( entry_time, '%D %M' ) as date,
GROUP_CONCAT( DATE_FORMAT( entry_time, '%h:%i %p' )
ORDER BY entry_time ASC
SEPARATOR '<br />' ) as times
FROM yourtable
GROUP BY DATE( entry_time )
ORDER BY entry_time
结果:
> date times
> 21st April 3:00 PM<br />3:50 PM
> 22st April 5:00 AM<br />4:00 PM
然后你可以通过它:
foreach($result as $row) {
echo $row->date. '<br />'. $row->times. '<br />';
}
修改强> 好处是所有的分类&amp;格式化在mysql引擎中完成,因此您已准备好显示结果
<强> EDIT2:强> 该查询将为您提供所需的确切结果:
SELECT CONCAT( DATE_FORMAT( entry_time, '%D %M' ), "<br />\n",
GROUP_CONCAT( DATE_FORMAT( entry_time, '%h:%i %p' )
ORDER BY entry_time ASC
SEPARATOR '<br />' ), "<br /><br />\n"
) as dates
FROM yourtable
GROUP BY DATE( entry_time )
ORDER BY entry_time
使用 foreach (或任何其他数组函数)来完成它:
foreach($result as $row) { echo $row->dates; }