0

我将 2010 年至 2040 年的日期存储在 mySQL 表中,格式如下:

2012-01-02

我从表中选择每个日期并在一段时间内显示它们 - mysql_fetch_assoc 循环

while($row=mysql_fetch_array($result)){

    echo $row["date"];

}

如何检查新的一个月是否已经开始?我怀疑我需要使用explode()将当前月份计数器放在var中......但是如何进行比较,因为var将在while循环中被覆盖

if(old month != new month){
    do something..
}

谢谢

4

4 回答 4

6
$old_month = '';

while($row=mysql_fetch_array($result)){
  list($year, $month, $day) = explode('-', $row["date"]);
  if($old_month != $month) {
    $old_month = $month;
    echo 'new month';
  }
}
于 2012-09-10T04:53:34.450 回答
1

您可以使用date_parse将几乎任何日期格式解析为其组件。例如:

$date = date_parse("2012-01-02");
var_dump($date);

将输出:

array(12) {
  ["year"]=>
  int(2012)
  ["month"]=>
  int(1)
  ["day"]=>
  int(2)
  ["hour"]=>
  bool(false)
  ["minute"]=>
  bool(false)
  ["second"]=>
  bool(false)
  ["fraction"]=>
  bool(false)
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
  ["is_localtime"]=>
  bool(false)
}

...您的代码将是这样的:

$month = false;
while( $row = mysql_fetch_array($result) ) {
    $date = date_parse( $row["date"] );

    if( $month != $date["month"] ) {
        $month = $date["month"];
        echo "month: {$month}<br />";        
    }

}

你真的应该停止使用mysql_*函数,它们已被弃用。尝试一下,如果您不知道哪个更合适,mysqli_*请阅读本文PDO

于 2012-09-10T04:56:06.150 回答
0

如果您只需要月份,那么您不必在 php 中分解日期格式,您可以在 mysql 查询中获取月份,例如

$query = "select month(date) as mont from table_name";

并检查其余的东西..

于 2012-09-10T04:56:11.543 回答
0

您可以使用存储变量在查询中执行此操作:

set @prevmonth := null;

select if(month(datefield) <> month(@prevmonth), true, false) AS new_month, @prevmonth := month(datefield), ....
FROM ...

然后只需在您的 fetch 代码中检查这个新的派生new_month字段 - 只要您到达新的月份,它就会为 1/true。

注意:因为第一行的比较将针对 null @prevmonth,所以第一行显示为 0/false。您可能希望第一行是真实的,但这超出了所有这些的范围。

于 2012-09-10T05:25:27.513 回答