【问题标题】:strtotime february bugstrtotime 二月错误
【发布时间】:2012-04-30 20:48:57
【问题描述】:

好的,所以我明白,如果我在 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 声明吗?那会是什么样子?

【问题讨论】:

  • 听起来不像是一个错误。 2 月实际上只有 28 天。或者至少在 1970 年是这样。
  • 我不明白您要使用该查询获取什么。 MONTH(billing_date) 会返回一个从 1 到 12 的数字,那你为什么不直接和 $i+1 比较呢?

标签: php strtotime


【解决方案1】:

这是一个纯 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 中您只需要一个显示循环。

【讨论】:

  • /* 为什么是 x16?!! */ 因为它是每次销售的美元价值。所以它最终显示了当月的总销售收入。我将不得不玩这个的输出。我明白你写的,只是不知道如何显示它。我相信我会弄清楚的。
  • 感谢@Tom 的澄清,我很好奇 :)。我刚刚编辑了答案,为计算列添加了别名,因此您可以在 while($row=mysql_fetch_array($result)) 循环中使用 $row['billing_year'] 等访问它们。
【解决方案2】:

如何索取二月份的所有记录...

SELECT * FROM table WHERE MONTH(billing_date) = 2

【讨论】:

  • 这将返回每年二月的所有记录。如果您只想要来自例如的记录2011 确保同时指定年份:AND YEAR( billing_date ) = 2011.
【解决方案3】:

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

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

【讨论】:

  • 是的。它正在规范化而不是真正的错误。再一次,strtotime 是如此多才多艺,似乎在二月份从一张桌子上要求所有东西不应该受到我从哪一天开始要求的影响。就像我看待它的方式一样。
【解决方案4】:

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

SELECT DATE_SUB(billing_date, INTERVAL 1 MONTH) FROM my_table

=> Manual

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多