表中有两个时间段,1 开始结算时间,2 终止结算时间, oracle 中如何实现每月半月结算一次,请赐教。

解决方案 »

  1.   


    select add_months(sdate, (rownum - 1)/2) + mod(rownum - 1, 2) * 15 as "开始日期",
           case when mod(rownum , 2) = 0 then last_day(add_months(sdate, (rownum - 1)/2)) 
                else add_months(sdate, (rownum - 1)/2) + mod(rownum, 2) * 15 - 1
            end as "结束日期"
      from (select trunc(sysdate,'mm') as sdate from dual)
     connect by rownum <= 6;开始日期     结束日期
    ------------ ------------
    2011-11-1    2011-11-15
    2011-11-16   2011-11-30
    2011-12-1    2011-12-15
    2011-12-16   2011-12-31
    2012-1-1     2012-1-15
    2012-1-16    2012-1-31
      

  2.   


    -- 上半月
    select '上半月' as comm ,to_char(aa.结束时间,'yyyy-mm'),sum(aa.销售数量),sum(aa.销售单价)
    from
    (select 合同表.合同号,合同表.开始时间,合同表.结束时间,订单表.销售数量,订单表.销售单价 from 合同表,订单表 where 合同表.合同号=订单表.合同号) aa
    where to_char(aa.开始时间 ,'dd') >=1 and to_char(aa.开始时间 ,'dd')<16 and to_char(aa.结束时间 ,'dd') >=1 and to_char(aa.结束时间 ,'dd')<16 group by to_char(aa.结束时间,'yyyy-mm')
    union
    select '下半月' as comm ,to_char(aa.结束时间,'yyyy-mm'),sum(aa.销售数量),sum(aa.销售单价)
    from
    (select 合同表.合同号,合同表.开始时间,合同表.结束时间,订单表.销售数量,订单表.销售单价 from 合同表,订单表 where 合同表.合同号=订单表.合同号) aa
    where to_char(aa.开始时间 ,'dd') >=16 and to_char(aa.开始时间 ,'dd')<32 and to_char(aa.结束时间 ,'dd') >=16 and to_char(aa.结束时间 ,'dd')<32 group by to_char(aa.结束时间,'yyyy-mm')
      

  3.   

    我是用存储过程来做的,关键就是这个时间不好算啊!那你说我取sysdate时间在开始和结束时间范围内,sysdate 的16号和下个月的1号之前的数据结算,这样做可行吗?