如果您有一组ISO日期,您将如何计算阵列中两个连续日期之间的最长时间?计算两个连续日期之间的最大天数
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
我想我需要一个循环,某种迭代变量和排序。我无法弄清楚。
这实际上是从MYSQL输出。
如果您有一组ISO日期,您将如何计算阵列中两个连续日期之间的最长时间?计算两个连续日期之间的最大天数
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
我想我需要一个循环,某种迭代变量和排序。我无法弄清楚。
这实际上是从MYSQL输出。
这里是你如何在PHP中做到这一点:
<?php
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
# PHP was throwing errors until I set this
# it may be unnecessary depending on where you
# are using your code:
date_default_timezone_set("GMT");
$max = 0;
if(count($array) > 1){
for($i = 0; $i < count($array) - 1; $i++){
$start = strtotime($array[$i]);
$end = strtotime($array[$i + 1]);
$diff = $end - $start;
if($diff > $max) $max = $diff;
}
}
$max = $max/(60*60*24);
?>
它循环扔你r项目(它比项目数量少执行一次)并比较每个项目。如果比较结果大于下一个,则更新最大值。时间以秒为单位,因此循环结束后,我们将秒转换为天。
恐怕这种方法不适用于几个原因。 1)它只测试所有可能差异的一个子集,例如数组中的第一个数据之间的差异,并说第三个数据从未被评估过。 2)它假定这两个日期按照升序排列。一个简单的测试可以修复#2,#1需要引入一个内部循环。 (这种方法btw效率较低,仅仅查找最小和最大日期并减去它们) – mjv 2009-11-29 06:23:23
问题是“连续日期之间的最大间隔”,因此第一次和第三次之间的距离是无关紧要的。由于问题列出了ASC顺序中的日期,我假定它们与MySQL的顺序相同。 – 2009-11-29 13:23:01
@dcneiner我明白你的观点,现在。有了这个问题的理解,你的答案当然是正确的。我并没有选择“顺序”,而是在提出可能需要“排序”的问题上提出了解决方案。 +1给你一个正确答案(在这个问题的这个视图中),我会编辑我的两个可能的答案。无论如何,我们可能会努力尝试一个措辞不佳的问题,而且一般不会回答(甚至是响应)OP ;-) – mjv 2009-11-29 17:25:20
EDIT:
如[原本]措辞问题可以被理解[至少;-)]有两种方式:
之间下面提供了一个答案的问题的“B”的理解。对于一个回应“A”,见dcneiner的解决方案
不排序的需要!...
如果它来自MySQL,你可能有这样的DBMS直接返回MIN和MAX的考虑值名单。
编辑:如Darkerstar所示,数据结构化的方式[和问题中指出的返回完整列表的现有SQL查询]通常决定产生MIN和MAX值的查询的方式应该是结构化的。
也许是这样的:
SELECT MIN(the_date_field), MAX(the_date_field)
FROM the_table
WHERE -- whatever where conditions if any
--Note: no GROUP BY needed
如果,不知何故,你不能使用SQL,单次通过该列表将让你获得在列表中的MIN和MAX值(O(n)的时间,那是)。
算法很简单:
将[最小值和最大值]设置为[未排序]列表中的第一项。
迭代通过列表中的每个下列项目,它与最小值比较和更换,如果发现小,做这样明智的最大值...
在手最小值和最大值,一个简单的差别使得天的最大数量...
在PHP中,它看起来如下:
<?php
$array = array('2009-03-11', '2009-03-12', '2009-04-12', '2009-05-03', '2009-10-30');
# may need this as suggested by dcneiner
date_default_timezone_set("GMT");
$max = $array[0];
$min = $max;
for($i = 1; $i < count($array); $i++){
// Note that since the strings in the array are in the format YYYY-MM-DD,
// they can be compared as-is without requiring say strtotime conversion.
if ($array[$i] < $min)
$min = $array[$i];
if ($array[$i] > $max)
$max = $array[$i];
}
$day_count = (strtotime($max) - strtotime($min))/(60*60*24);
?>
MIN和MAX并不真正相关。日期之间的最长时间不一定是MIN或MAX(日期)。我可以在每一行之间做一个DATEDIFF,但我不确定你会怎么写。 – rrrfusco 2009-11-29 05:34:31
除非我误解了这个问题,Min和Max非常相关。尽管您比较阵列中所有可能的日期对的计划也可以发挥作用,但这种方法最终还是要做更多的工作。除了必须跟踪最小值和最大值(“迄今为止”),在你的情况下,差值的最小/最大值,但最小值/最大值都是一样的......,你需要执行n *(n - 1)差异,这使得算法O(n^2),更不用说与管理所有对的生成相关的开销/复杂性... – mjv 2009-11-29 05:46:57
您如何编写SQL取决于数据的结构。如果你有一个日期字段,你可以这样写: 如果你正在尝试计算一行中的两个日期,那么你可以写下如下的代码: “select TO_DAYS(MIN(mydate),MAX(mydate))from mytable where cust_id =然后: “select DATEDIFF(date1,date2)作为numdays,MAX(numdays)从表中where xxxx group by xxxx” – Darkerstar 2009-11-29 05:55:10
这PHP脚本会给你最大的间隔
1){ 为($ I = 0; $ I $ maxinterval)$ maxinterval = $天; } } ?>
那是什么输出? – 2009-11-29 07:34:00
我不明白。你找到答案了吗?如果是这样,请在您自己的答案中用代码提供代码并将其标记为已解决,或者如果这些答案非常接近,请将其中一个答案标记为正确答案。 – 2009-11-29 13:29:40