我在php中创建了一个报告,其中显示了6个html下拉菜单,并提示用户输入他们希望查看报告数据的两个日期。例如,报告如下:
查看以下数据:[月] [日] [年]和[月] [日] [年](括号表示选择标记)
此报告中还有一个函数,用于计算前一天的增加或减少百分比。因此,例如,如果用户没有选择任何日期范围,那么它只是当天的数据,百分比计算如下:
round(((($newDataPointCount - $yesterdayDataPointCount) / $yesterdayDataPointCount) * 100),2)
这显然很容易计算一天,因为我可以告诉它用INTERVAL 1 DAY查询SQL数据库。但这是我的问题,如果月份变化,我将如何计算日间隔数?
如果用户在一个月内停留,那么一切都会很好,所以它会像[March] [20] [2012] - [March] [29] [2012]那样,我可以轻松地计算出值为9,但是当它像[二月] [27] [2012] - [三月] [20] [2012]那样时,我该如何计算它们之间的天数呢?
为了澄清可能出现的任何问题,我使用的是PHP和MySQL,并希望保持在这些范围内。
答案 0 :(得分:1)
MySQL DATEDIFF函数应完成任务
答案 1 :(得分:1)
日期不是标量,不应该这样对待。我的建议是使用适当的日期算术工具。
很多人建议使用面向时间戳的日期数学:
$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没有简单的方法“嘿,抓住这些日期之间的每一条记录,当你在它的时候,按照每条记录的先前记录做一些数学运算。”
我希望这一点已经很明确了,但我觉得除了清晰度之外它还有漫无边际的情况,所以如果是这样,请告诉我,我会编辑我的答案。