有这样一批数据,想进行周统计 
日期               面积           金额
2010-7-6 17:10   126.64 360164
2010-7-6 18:24   127.2         453748
2010-7-13 9:22   221.13 663390
2010-7-5 17:26   36.88         332510
2010-7-6 18:02   127.2         457119
2010-7-4 14:53   88.46         169401
2010-7-19 9:38   122.74 410258
2010-7-15 11:15   76.93         145782
2010-7-11 17:00   78.74         150787
2010-7-4 9:37   76.93         146552
2010-8-14 9:30   62.42  259043
2010-8-13 15:59   119.18 449130
2010-8-12 10:59   61.89  163390
2010-8-12 11:41   168.68 568384
2010-8-12 16:52   196.28 821569
2010-10-14 17:32  156.08 591855
2010-8-13 18:18   998.8  3076304
2010-8-14 10:23   98.86  310420
2010-8-14 11:55   159.49 600193
2010-8-14 14:28   124.31 472055
2010-8-15 11:37   126.54 499567
2010-8-15 16:18   125.79 395710
.....
统计结果类似:
日期始       日期终            面积        金额
2010-7-4     2010-7-10
2010-7-11    2010-7-17
2010-7-18    2010-7-24
2010-7-25    2010-7-31
2010-8-1     2010-8-7       想请教一下,该如何写查询语句,数据库为Oracle.
现参考了一下
http://topic.csdn.net/u/20070206/18/CCE1BE88-C576-4F5D-A9CB-9384FE4126D1.html,把datediff,dateadd,datepart这三个SQLServer函数用ORALCE自定义函数实现了,可结果划分的周日期不对

解决方案 »

  1.   

    楼主结贴给分吧,下面这个SQL绝对可行select t.weekStartDate, t.weekEndDate, sum(area), sum(amount)
      from (select TO_CHAR(thedate - TO_NUMBER(TO_CHAR(thedate, 'D')) + 2,
                           'YYYY-MM-DD') weekStartDay, --日期所在星期第一天
                   TO_CHAR(thedate - TO_NUMBER(TO_CHAR(thedate, 'D')) + 9,
                           'YYYY-MM-DD') weekEnDayd, --日期所在星期的最后一天
                   area, --面积
                   amount, -- 金额
              from tab_name) t
     group by t.weekStartDate, t.weekEndDate;
      

  2.   

    不好意思,应该是下面这个SQL,在数据库里面试验过
    创建表:create table tab_name(
       thedate date,
       area  number(9,2),
       amount number(9,2)
     );
    测试数据:
    1 2011/3/19 15:45:59 20.00 30.00
    2 2011/3/18 15:46:12 20.00 30.00
    3 2011/3/17 15:46:19 20.00 30.00
    4 2011/3/16 15:46:25 20.00 30.00
    5 2011/3/15 15:46:31 20.00 30.00
    6 2011/3/14 15:46:37 20.00 30.00
    7 2011/3/13 15:46:49 20.00 30.00
    8 2011/3/12 15:46:58 20.00 30.00
    9 2011/3/11 15:47:04 20.00 30.00
    运行结果:
    1 2011-03-07 2011-03-13 60 90
    2 2011-03-14 2011-03-20 120 180
    select t.weekStartDate, t.weekEndDate, sum(area), sum(amount)
      from (select TO_CHAR(thedate - TO_NUMBER(TO_CHAR(thedate - 1, 'D')) + 1,
                           'YYYY-MM-DD') weekStartDate, --当前日期所在星期第一天
                   TO_CHAR(thedate - TO_NUMBER(TO_CHAR(thedate - 1, 'D')) + 7,
                           'YYYY-MM-DD') weekEndDate, --当前日期所在星期的最后一天
                   area, --面积
                   amount -- 金额
              from tab_name) t
     group by t.weekStartDate, t.weekEndDate;
      

  3.   

    /** 使用TO_CHAR(SYSDATE,'D')可以求得当前日期是一周的第几天  
        得到的结果是星期日开始作为第1天的, 
        那么星期一就是第2天,星期日就是第8天 
    */ 
    SELECT TO_CHAR( SYSDATE ,'YYYY-MM-DD' ) 今天,   
           DECODE(TO_CHAR(SYSDATE,'D'), 
                  '1','星期日', 
                  '2','星期一', 
                  '3','星期二', 
                  '4','星期三', 
                  '5','星期四', 
                  '6','星期五', 
                  '7','星期六') 星期几, 
            TO_CHAR( SYSDATE - TO_NUMBER( TO_CHAR(SYSDATE,'D') ) + 2,'YYYY-MM-DD' ) 星期一, 
            TO_CHAR( SYSDATE - TO_NUMBER( TO_CHAR(SYSDATE,'D') ) + 8,'YYYY-MM-DD' ) 星期日 
      FROM DUAL
      

  4.   

    http://blog.csdn.net/hanks_gao/archive/2011/03/19/6261027.aspx楼主可以建立这样一个Table,相信后面会用的到
      

  5.   

    如果是以从周日开始为周期
    直接trunc(日期,'D')就行了
    select trunc(dt,'D') 
           ,trunc(dt,'D')+6
           ,sum(area)
           ,sum(amount)
    from tab
    group by trunc(dt,'D'),trunc(dt,'D') +6
    ;  
      

  6.   

    select 新日期,sum(金额)总金额 
    from (
    select next_day(日期-7,'Monday') 新日期,日期,金额
    from 表 )
    group by 新日期