Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中简单数据仓库的日期间隔_Php_Date_Data Warehouse - Fatal编程技术网

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

PHP中简单数据仓库的日期间隔,php,date,data-warehouse,Php,Date,Data Warehouse,我正在实现一个基本的星型模式,为我的公司提供采购报告。我们的事实表以4个维度进行汇总,并以每日、每周、每月和每年的总数进行汇总 代码目前知道如何处理单日、周、月和年的报告。下一步是实现任意日期范围的报告。提供一个范围,目标是了解这两个日期之间的年、月、周和天的总数,并提取适当的记录来计算总数。问题是我们需要确定两个日期之间每个完整的粒度周期的计数,而不仅仅是所用的时间 例如,“2009-06-29”和“2011-06-29”之间已经过去了2年,但我们需要知道,这一范围包括一整年(2010年)、1

我正在实现一个基本的星型模式,为我的公司提供采购报告。我们的事实表以4个维度进行汇总,并以每日、每周、每月和每年的总数进行汇总

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

例如,“2009-06-29”和“2011-06-29”之间已经过去了2年,但我们需要知道,这一范围包括一整年(2010年)、11个月(2009年1月至5月10日和7月至12月)和58天(2009年6月1日至29日和2011年6月1日至29日)

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

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

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


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

    我不明白您为什么要实现这样一个复杂的解决方案,通常的实现是只有一个事实表,其中的数据具有最低的粒度级别(在您的情况下是每天),并根据需要简单地汇总查询中的度量值

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

    如果您考虑的是性能问题,DWH通常会演变成这样:

  • 实现单个事实表(如上所述)
  • 添加大量数据
  • 随着数据量的增加,发现性能问题
  • 改进索引
  • 实现表分区
  • 实现OLAP

  • 您的解决方案听起来有点像自制的OLAP实现,但不清楚为什么需要它。如果您的数据量是中小型的,那么您可能能够通过索引和分区很好地管理它。如果它很大,那么您可能会考虑使用OLAP和专门的报告工具,这将是一个更广泛的问题。但是您没有提供太多关于您的环境或需求的信息,因此我在这里可能有点离题。

    我不明白您为什么要实现这样一个复杂的解决方案,通常的实现是只有一个事实表,其中的数据具有最低粒度级别(在您的情况下是每日)和简单的SUM()根据需要在查询中设置度量值

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

    如果您考虑的是性能问题,DWH通常会演变成这样:

  • 实现单个事实表(如上所述)
  • 添加大量数据
  • 随着数据量的增加,发现性能问题
  • 改进索引
  • 实现表分区
  • 实现OLAP

  • 您的解决方案听起来有点像自制的OLAP实现,但不清楚为什么需要它。如果您的数据量是中小型的,那么您可能能够通过索引和分区很好地管理它。如果它很大,那么您可能会考虑使用OLAP和专门的报告工具,这将是一个更广泛的问题。但是,您没有提供关于您的环境或需求的太多信息,因此我在这里可能有点离题。

    您是否可以选择该期间的所有每日汇总并在SQL中求和?您是否可以选择该期间的所有每日汇总并在SQL中求和?