【问题标题】:The best way to get the first and last day of last month?获得上个月的第一天和最后一天的最佳方式?
【发布时间】:2012-04-01 21:33:08
【问题描述】:

我正在寻找获得上个月第一天和最后一天的最佳方式。我使用它们进行 SQL 查询以获取上个月的统计信息。

我认为这是最好的方法,更优化但不是更全面,有人有其他方法吗?

    $month_ini = date("Y-m-d", mktime(0, 0, 0, date("m", strtotime("-1 month")), 1, date("Y", strtotime("-1 month"))));

    $month_end = date("Y-m-d", mktime(0, 0, 0, date("m", strtotime("-1 month")), date("t", strtotime("-1 month")), date("Y", strtotime("-1 month"))));

谢谢!!

【问题讨论】:

标签: php mysql optimization date


【解决方案1】:

你可以在 MySQL 中做到这一点:

WHERE `DateAndTime` >= '2012-02-01 00:00:00'
AND `DateAndTime` < '2012-03-01 00:00:00'

【讨论】:

  • 谢谢,但在 mysql 中这样做会更慢 :( 谢谢,我需要优化
  • DateAndTime 列上放置一个索引。我会说你不会比这更快。
【解决方案2】:

如果您这样做是为了进行 MySQL 查询,您是否考虑过使用 MONTH function,例如

SELECT [whatever stats you're after] FROM table
WHERE MONTH(date_field) = 12 and YEAR(date_field) = 2011

这将获得您 12 月的统计数据。如果您开始遇到性能问题并且历史数据没有改变,您可能希望将数据非规范化到一个聚合表中(按您需要的最小增量汇总,例如每天/每小时/每月等)。

【讨论】:

  • 如果有 2010 年 12 月和 2011 年 12 月的行怎么办?你如何区分它们?
  • @Bazzz Doh!好地方,已经添加了等效的 YEAR 过滤器(尽管如果你点击我提供的链接,这应该很明显!)
【解决方案3】:

上个月的最后一天:

date("Y-m-d", mktime(0, 0, 0, date("m"), 0));

上个月的第一天:

date("Y-m-d", mktime(0, 0, 0, date("m")-1, 1));

【讨论】:

  • 不错的答案;如果当前月份是 01(一月) date() 会将年份减一并将月份回滚到 12,效果很好。谢谢!
  • 这有很大帮助,但是没有解释或解释为什么它起作用的链接。 IE。第一条语句中的 0 是最后一天,因为...(0 有效地表示 -1,因为任何月份都没有 0 天,PHP 将其作为第 1 - 1 天)
  • 警告:当使用时间为 00:00:00 的最后一天时......如果在查询中使用它,则日期时间将不包括那一天,因为它是在 0 时间。要包括一整天,时间需要是 23:59:59 ...替代方法是只使用下个月 1 日的 0 时间。
【解决方案4】:

在 PHP 5.3 中,您可以使用 DateTime 类:

<?php

$month_ini = new DateTime("first day of last month");
$month_end = new DateTime("last day of last month");

echo $month_ini->format('Y-m-d'); // 2012-02-01
echo $month_end->format('Y-m-d'); // 2012-02-29

【讨论】:

  • 这应该是恕我直言的答案
  • 如果您需要时间戳,这也可以与 strtotime() 一起出色地工作。喜欢strtotime('last day of last month')
  • 如果你想要某个日期所在月份的第一天/最后一天,你会怎么做?
  • 您可以使用new DateTime("first day of February 2012")new DateTime("first day of 2012-02") 例如。
  • 请注意,您获取的不是第一天的开始时间,而是服务器的当前时间。我喜欢它,但不要使用整个对象,请确保按照@Phen 的建议进行格式化!
【解决方案5】:

让 mysql 处理日期。

数据库要做的事情,让它去做。

像这样:

mysql_query("set @last_day=last_day(now()-interval 1 month),@first_day=(@last_day-interval 1 month)+interval 1 day");
$result=mysql_query("select * from `table` where (`date` between @first_day and @last_day)");

最好的是,即使年份发生变化,这也能正常工作。

只要记住更改数据库时区以匹配 php。

【讨论】:

    【解决方案6】:

    我在 MySQL 和 PHP 脚本中使用这些,简短而简单:

    echo date('Y-m-d', strtotime('first day of last month'));
    echo date('Y-m-d', strtotime('last day of last month'));
    

    MySQL 使用示例:

    $query = $db->query("SELECT * FROM mytable WHERE 1 AND mydate >= '".date('Y-m-d', strtotime('first day of last month'))."'");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-03
      • 2013-11-25
      • 2017-01-07
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      相关资源
      最近更新 更多