Run
Run

Reputation: 57176

PHP: Format and sort the dates from MySQL Database

I have these mysql dates in a table of my database,

2010-07-16 20:09:06
2010-08-16 20:19:43
2010-10-18 16:57:19
2009-09-18 16:57:42
2009-10-18 16:57:55
2009-12-24 14:59:21

How can I sort them into the result below so that I can have the end user browses monthly results?

<h2>2010</h2>
<ul>
 <li><a href="#">October</a></li>
 <li><a href="#">November</a></li>
 <li><a href="#">December</a></li>
</ul>

<h2>2009</h2>
<ul>
 <li><a href="#">September</a></li>
 <li><a href="#">October</a></li>
 <li><a href="#">November</a></li>
 <li><a href="#">December</a></li>
</ul>

can't think of anything!

I usually use gmdate() to format the dates from mysql database, for instance,

<?php
 $sql = "
 SELECT *
 FROM root_pages

 WHERE root_pages.pg_hide != '1'

 ORDER BY pg_created DESC";

#instantiate the object of __database class
$object_items = new __database(DB_HOST,DB_USER,DB_PASS,DB_NAME);
$items = $object_items -> fetch_all($sql);

echo  gmdate('j/n/Y', strtotime($item['pg_created']));
?>

it would great if you can give me some hint to start!

thanks, Lau

Upvotes: 1

Views: 2333

Answers (3)

Pepe Y&#225;&#241;ez
Pepe Y&#225;&#241;ez

Reputation: 11

You can use my trick:

1 get all the info out of mysql as-is using some of the others comment's good advice.

2 make an array using strtotime:

<php? $r=array((int)strtotime('2010-07-16')=>'2010-07-16 20:09:06',) ?>

3 --sort it using

ksort($r,SORT_NUMERIC) or krsort,

Have fun with php sorting functions. http://www.php.net/manual/en/function.sort.php

Note. the only down fall to this approach is that in a 32 bit machine the numeric values have limits and numbers higher than (int)2147483647 have to be cast as (strings) or (float) to be used as array keys.

You can us a dot (string)'2147483647.'

Upvotes: 0

Matthew
Matthew

Reputation: 48284

There's plenty of ways to do this... Using MySQL, you could

SELECT DISTINCT YEAR(dt) y, MONTH(dt) m FROM t ORDER BY dt DESC

Then loop through the results:

$year = null;
foreach ($rows as $row)
{
  if ($year != $row->y)
  {
    if ($year) echo "</ul>";
    $year = $row->y;
    echo "<h2>$year</h2>\n";
    echo "<ul>\n";
  }

  echo "<li><a href='#'>{$month_name[$row->m]}</a></li>\n";
}
if ($year) echo "</ul>";

It assumes there is an array called $month_name that maps a month number to its name.

This method is most useful if you don't need the other data for that page. If you do need the full data, then you can drop the DISTINCT from the SQL, SELECT all the field you need, and add a variable to track the current $month throughout the iteration, as the above code does with $year.

Upvotes: 1

deceze
deceze

Reputation: 522076

Assume date is the date column you're interested in.

SELECT DATE_FORMAT(`date`, '%m-%Y') AS `formatted_date`
FROM `pages`
GROUP BY `formatted_date`
ORDER BY `date`

08-2010
09-2010
11-2010
12-2010
02-2011
03-2011

This gives you all the months that have pages. It should be simple enough to output this in some HTML. Some functions that may help along the way: explode, mktime, strtotime, date.

Upvotes: 1

Related Questions