获得上个月第一天和最后一天的最佳方式是什么?

时间:2012-03-16 10:29:14

标签: php mysql optimization date

我正在寻找获得上个月第一天和最后一天的最佳方式。我使用它们进行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"))));

谢谢!

6 个答案:

答案 0 :(得分:115)

在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

答案 1 :(得分:59)

上个月的最后一天:

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

上个月的第一天:

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

答案 2 :(得分:5)

我在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'))."'");

答案 3 :(得分:3)

如果您是出于MySQL查询的目的而这样做,请考虑使用MONTH function,例如

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

让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。