2012-03-16 124 views
39

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

谢谢!!

+0

可能重复:// stackoverflow.com/questions/1686724/php-last-day-of-the-month) – DaveRandom 2012-03-16 10:33:14

+0

你有没有试过strtotime? – 2012-03-16 10:33:30

+0

http://stackoverflow.com/questions/2680501/how-can-i-find-the-first-and-last-date-in-a-month-using-php – 2012-03-16 10:33:36

回答

95

在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

这应该是答案imho – LeonardChallis 2013-06-11 22:00:36

+3

这也是如果你想要一个时间戳,可以用'strtotime()'出色地工作。像'strtotime('上个月的最后一天')'。 – 2013-09-11 10:39:52

+0

如果tou想在某月某月的第一个/最后一天进入,你会怎么做? – Czechnology 2014-01-15 17:36:39

0

你可以在MySQL做到这一点:

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

谢谢,但更慢在mysql :(在此感谢,我需要优化 – aaronroman 2012-03-16 10:41:17

+0

把一个索引放在'DateAndTime'列。假设你不会得到比这更快的结果 – Bazzz 2012-03-16 10:42:43

3

如果你这样做了MySQL查询的目的,你有没有考虑使用MONTH function,例如

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

这将得到您的12月的统计数据。如果您开始遇到性能问题,并且历史数据不会更改,则可能需要将数据非规范化为汇总表(按您需要的最小增量汇总,例如每天/每小时/每月等)。

+0

以及2010年12月和2011年12月有多少行?如何区分它们? – Bazzz 2012-03-16 10:41:08

+0

@Bazzz Doh!好点,已经添加了等效的YEAR过滤器(尽管如果你遵循我提供的链接,这应该是非常明显的!) – liquorvicar 2012-03-16 10:44:13

55

末前一个月的一天:

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

前一个月的第一天:

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

很好的答案;如果当前月份是01(1月),那么date()会将年份减1,并将该月份换回到12,这很好。谢谢! – jwbensley 2012-03-20 16:50:33

+0

这非常有帮助,但没有解释或链接到它为什么工作的解释。即。在第一个语句中的0是最后一天,因为...(0有效意味着-1,因为在任何月份没有0天,PHP将它作为1 - 1) – Tarquin 2016-06-29 00:07:58

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

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

MySQL的使用例子:

3

我在MySQL和PHP脚本,短期和简单的使用这些

$query = $db->query("SELECT * FROM mytable WHERE 1 AND mydate >= '".date('Y-m-d', strtotime('first day of last month'))."'"); 
[本月的PHP最后一天(HTTP的
相关问题