0

29 日以降に strtotime 関数を実行すると、2 月のバグが発生し、代わりに 3 月の結果が得られることは理解しています。

また、日付を 2 月 1 日に設定すると、この問題を回避できることがわかりました。

しかし、ここに問題があります。過去 12 か月の記録を調べて、追跡用の売上/請求番号を生成しています。ループが次のようになっている場合、2 月にすべてのレコードを要求するにはどうすればよいですか?

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++;
}

2 月のバグを回避するにはどうすればよいですか? 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

2月のすべてのレコードを求めるにはどうすればよいですか...

SELECT * FROM tableWHERE MONTH(請求日) = 2

于 2012-04-30T21:01:10.517 に答える
0

2月バグ?バグではありません。日付の正規化は (便利な) 機能です! :-)

2 月の最終日が必要な場合は、3 月 0 日を指定してください。

于 2012-04-30T20:53:55.990 に答える
0

「2月のバグ」はわかりませんが、MySQLを使用して1か月を差し引くことができます。小切手

SELECT DATE_SUB(billing_date, INTERVAL 1 MONTH) FROM my_table

=>マニュアル

于 2012-04-30T20:53:58.083 に答える