PHP中简单数据仓库的日期之间的间隔

时间:2011-11-14 14:56:45

标签: php date data-warehouse

我正在实施一个基本的星型模式,为我的公司提供购买报告。我们的事实表总结为4个维度,并与每日,每周,每月和每年总计汇总。

该代码目前知道如何处理单天,几周,几个月和几年的报告。下一步是实施任意日期范围报告。提供范围,目标是了解两个日期之间的年,月,周和天的总数,并拉到适当的记录来计算总数。问题是我们需要确定两个日期之间每个完整粒度周期的计数,而不仅仅是经过的时间量。

例如,“2009-06-29”和“2011-06-29”之间已过去2年,但我们需要知道此范围包括一整年(2010年),11个月(1月至5月) / 10& Jul-Dec / 09)和58天(Jun 1-29 / 09& Jun 1-29 / 11)。

从这个结果我们可以从70个粒度周期中提取已经汇总的记录,合并并呈现总计。

我一直在编写测试代码,以确定将日期范围分解为其组成部分的最佳方法,但我正在退步,因为我怀疑我正在过度思考这个过程。目前的草案如下:

  1. 使用初始日期范围填充“datesToParse”数组。
  2. 确定日期之间是否存在一个或多个完整年份。
    • 对于日期之间的每一年,从日期范围中删除该期间,并将该年份的“期间之前”和“期间之后”拆分为两个新的日期范围。
    • 在“datesToParse”堆栈上推送两个新的日期范围。
    • 重复
  3. 当从“datesToParse”数组中删除所有可能的年份后,重复该过程数月,数周和数天。
  4. 理论上,这应该递归地将初始日期范围缩小到一整年,几个月,几周和几天的集合。

    有更好的方法吗?这似乎是一个以前已经解决过很多次的问题。

1 个答案:

答案 0 :(得分:1)

我不明白为什么要实现这样一个复杂的解决方案,通常的实现是只有一个事实表,其中数据的粒度最低(在你的情况下是每天),而简单的是SUM()根据需要在您的查询中进行衡量。

实现和维护非常简单,查询非常容易编写(或从报告工具生成)。这不适合你吗?你有多少数据?您是否已将日期实现为维度(希望是)或作为事实表中的值?您使用报告工具(SSRS,Cognos,Business Objects)还是滚动自己的查询?

如果您正在考虑性能问题,那么DWH就像这样发展是很常见的:

  1. 实施单一事实表(如上所述)
  2. 添加大量数据
  3. 随着数据量的增加发现性能问题
  4. 改进索引
  5. 实施表格分区
  6. 实施OLAP
  7. 您的解决方案听起来有点像自制的OLAP实现,但不清楚为什么需要它。如果您的数据量小到中等,您可能能够通过索引和分区来很好地管理它。如果它很大,那么你可能正在考虑使用OLAP和专业的报告工具,这将是一个更广泛的问题。但是你没有提供有关你的环境或要求的更多信息,所以我可能在这里不合时宜。