PHP / mysql:如何显示按时间排序并按日期分组的记录?

时间:2011-06-22 05:52:21

标签: php mysql date datetime

我需要显示按日期分组的记录,并按时间排序。在mysql表中,我有一个名为entry_time的字段,其中存储了php time()值。什么是最简洁,最简单的方法呢?

Ex:我需要一个像:

这样的显示器
21st April
3:00 pm
3:50 pm

22 April
5:00 am
4:00 pm

7 个答案:

答案 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()时,最简单的方法是:

  1. 使用time()按列对表进行排序。
  2. 从表中查询每条记录的时间戳(我假设您只需要日期和时间)。
  3. 对于结果中的每一行,请拨打date()两次:一天一个月,一个一小时。保存上次使用的日期,如果它们相同,请将下一次放入相同的数组元素(我假设您使用LainIwakura存储此类数据的解决方案)。
  4. 以您想要的方式显示。

答案 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; }