2012-03-29 115 views
0

我在php中创建了一个报告,其中显示了6个html下拉菜单,并提示用户输入他们想要查看报告数据的两个日期。因此,例如报告继续如下:之间有关日期在PHP中的逻辑

看到资料:[月] [日] [年]和[月] [日] [年](其中括号表示一个选择标签)

而且在这个报告中是一个函数,它可以计算前一天增加或减少的百分比。因此,举例来说,如果用户不选择任何日期范围,它只是当天的数据,而且这个比例计算公式为:

round(((($newDataPointCount - $yesterdayDataPointCount)/$yesterdayDataPointCount) * 100),2) 

这显然是很容易计算只有一天,因为我可以告诉它用INTERVAL 1 DAY查询SQL数据库。但这是我的问题,如果月份发生变化,我将如何计算日间间隔的数量?

如果用户在一个月内停留,所以它会像[3月] [20] [2012] - [3月] [29] [2012]一样工作,我可以很容易地计算出该值为9 ,但是当[2月] [27] [2012] - [3月] [20] [2012]这样的情况下,我如何计算中间的天数?

只是为了澄清任何可能出现的问题,我使用PHP和MySQL,并希望保持在这些范围内。

回答

1

MySQL的DATEDIFF函数应该完成的任务

DATEDIFF

+0

我刚刚签出了php date-> diff函数。谢谢你的提示! – bswinnerton 2012-03-29 21:01:06

1

日期是不是标量,不应该被如此对待。我的建议是使用适当的日期算术工具。

很多人认为UNIX时间戳面向日期的功能:

$a = '2012-02-12 14:03:50'; 
$b = '2012-05-30 00:55:03'; 
$days = (strtotime($b) - strtotime($a))/86400; 

然而,日光节约时间和各种因素,可以使这种类型的数学错误的。

我的做法是通常使用的DateTime:

$a = new DateTime('2012-02-12 14:03:50'); 
$b = new DateTime('2012-05-30 00:55:03'); 
$diff = $b->diff($a); 
//$diff is now a DateInterval 

然而,要回答你的真正的问题,我不会拉从MySQL基于MySQL的日期数学中的数据,而是我只想给它的日期。

WHERE d >= '2012-02-27' AND d <= '2012-03-29'; 

虽然根据您的要求,您可能需要更改27到26,以抓住前一天并使用它进行计算。

至于做点值的变化,我要么预先计算并存储它们,要么我只是用PHP计算它们。有没有简单的方法告诉SQL“嘿抓住这些日期之间的每一条记录,并且当你在它的时候,对每条记录的先前记录做一些数学计算。”

我希望这已经很清楚了,但是我有一种感觉,它与边界清晰度不同,所以如果是这样,请让我知道,我会编辑我的答案。