Mysql和Perl使用INTERVAL来计算总数

时间:2011-09-08 17:11:16

标签: mysql perl date intervals

谢谢你的一个例子。我很难找到一个间隔的陈述...... 我需要在特定的日期间隔内计算用户,但必须由用户输入间隔。示例:从“2010/05/05”到“2010/30/07”,如果间隔为1m(月),则此用户每1m间隔的总数,如下所示:2010/05/05至2010/06/05是总用户数。 到目前为止,我得到了:

SELECT col1, client, COUNT(client) FROM table1, table2 WHERE col1 IN (condition) AND  date BETWEEN '2010/05/01' AND '2010/07/30' AND DATE_ADD(CURDATE(),INTERVAL + 1  month) GROUP BY client;

当然,它会计算所有总数,但不计算间隔日期。

我还尝试使用Perl

my @data; #data from dbase.
%date_hash = ($data[1] =>$total);  #$data[1] is beg and  end dates user entered 
foreach  $dates (values %date_hash) {
    $date_hash{$dates}=$total;   
    print "Print hash:  $dates        $date_hash{$dates} \n"

提前谢谢你:)

1 个答案:

答案 0 :(得分:0)

一种可能的SQL解决方案(我将提供算法,而不是确切的SQL代码)

  • 创建一个临时表INTERVALS,填充它(可能最容易在Perl中循环,但MYSQL循环就足够了),数据如下(从2010年5月5日到12月/ 2010年10月,间隔1个月):

    | start_period | end_period | interval_number |
    ===============================================
    | 2010/05/05   | 2010/06/04 | 1               |
    | 2010/06/05   | 2010/07/04 | 2               |
    | ...
    | 2010/12/05   | 2010/12/10 | 8               |
    
  • 然后,通过

    运行将表连接到INTERVALS临时表的查询
     SELECT client, COUNT(client)
          , i.interval_number, i.start_period, i.end_period
     FROM table1 
     WHERE col1 IN (condition)
     AND table1.date >= inetrvals.start_period
     AND table1.date <= inetrvals.end_period
     GROUP BY client, i.interval_number, i.start_period, i.end_period
    

    请注意,您可以从table1中选择其他列,但前提是您也可以将它们分组。