0

好的,所以我明白如果我在 29 日或更高的一天运行 strtotime 函数,我将引发二月错误并获得三月的结果。

我也知道如果我将日期设置为 2 月 1 日,我可以避免这个问题。

但问题就在这里。我正在滚动过去 12 个月的记录,以生成用于跟踪的销售/帐单号码。当我的循环看起来像这样时,如何在二月份询问所有记录?

setlocale( LC_MONETARY, 'en_US' );

$i = 0;
while( $i <= 11 ) {                 
  $select = "SELECT * FROM `my_table` " . 
            "WHERE YEAR( billing_date )  = '" . date( 'Y', strtotime( -$i . ' month' )) . "' " . 
            "  AND MONTH( billing_date ) = '" . date( 'm', strtotime( -$i . ' month' )) . "'";

  $result   = mysql_query( $select );
  $num_rows = mysql_num_rows( $result );

  $sales    = 16 * $num_rows;

  echo "<p align='center'>";
  echo   "Sales for " . date( 'M, Y', strtotime( '-' . $i . ' month' ) ) .
         "&nbsp" . money_format( '%i', $sales );
  echo "</p>";

  $i++;
}

如何避免二月错误?会是if表态吗?那会是什么样子?

4

4 回答 4

3

这是一个纯 SQL 解决方案(如果我正确理解了场景):

SELECT 
    YEAR(billing_date) AS billing_year,  
    MONTH(billing_date) AS billing_month,
    16 * COUNT(*) AS sales /* Why x16?!!! */
FROM my_table
GROUP BY YEAR(billing_date), MONTH(billing_date)

这将直接在 SQL 中计算销售额,因此在 PHP 中您只需要一个显示循环。

于 2012-04-30T20:56:23.067 回答
1

我如何要求二月份的所有记录...

SELECT * FROM tableWHERE MONTH(billing_date) = 2

于 2012-04-30T21:01:10.517 回答
0

二月虫?这不是一个错误。标准化日期是一个(有用的)功能!:-)

如果您想要 2 月的最后一天,请询问 3 月 0 日。

于 2012-04-30T20:53:55.990 回答
0

我不知道“二月错误”,但您可以尝试使用 MySQL 减去 1 个月。查看

SELECT DATE_SUB(billing_date, INTERVAL 1 MONTH) FROM my_table

=>手册

于 2012-04-30T20:53:58.083 回答