oracle 取当月到现在的时间天,比如今天是1月2号.那取出来的就是:
2008-01-01
2008-01-02如果今天是1月20号,那就:
2008-01-01
2008-01-02
.....
.....
.....
2008-01-20
这个语句应该怎么写?

解决方案 »

  1.   


    declare
      inum   number;
      vdate  date;
    begin
      inum:=sysdate-trunc(sysdate,'MM')+1;
      for i in 0..inum loop
        vdate:=trunc(sysdate,'MM')+i; 
        dbms_output.put_line(to_char(vdate,'YYYY-mm-dd'));
      end loop;
    end
      

  2.   

    DECLARE
    V_COUNT NUMBER := 0;
    v_date  DATE := SYSDATE;
    BEGIN
    V_COUNT := TO_NUMBER(to_char(SYSDATE,'yyyymmdd')) -TO_NUMBER(to_char(SYSDATE,'yyyymm') || '01')+1;
    LOOP
    DBMS_OUTPUT.put_line(v_date);
    v_date  := v_date - 1;
    V_COUNT := V_COUNT - 1;
    EXIT WHEN V_COUNT = 0;
    END LOOP;
    END;
      

  3.   

    try it ..
    SQL> select sysdate from dual;SYSDATE
    -----------
    1/2/2008 1:SQL> 
    SQL> select trunc(sysdate,'mm') + rownum -1 as All_Days
      2    from (
      3          select rownum rn
      4            from all_objects
      5           where rownum <= (to_char(sysdate,'dd') - to_char(trunc(sysdate,'mm'),'dd')) + 1
      6         )tt
      7   where to_char(trunc(sysdate,'mm'),'dd') - rownum + 1 >= 0;ALL_DAYS
    -----------
    1/1/2008
    1/2/2008
      

  4.   

    刚写了一个获得时间列表得帖子。http://blog.csdn.net/heyixiang/archive/2007/12/28/1999979.aspx
      

  5.   

    参照4楼的贴子写了个,但是不明其理,纯粹模仿...select to_char(trunc(sysdate,'mm') + rownum - 1, 'yyyy-mm-dd') as day
      from dual
    connect by trunc(sysdate,'mm') + rownum - 1 <= trunc(sysdate)
     order by day ASC 
      

  6.   

    就解释一下上面的做法吧。connect by是主要用来生成树型结构。trunc(sysdate,'mm')用来取得现在系统时间的月份的第一天。
    rownum就是行数
    to_char(trunc(sysdate,'mm') + rownum - 1就是第几天。
    条件也可以明白了,就是不大于系统时间。条件里面呢,用了trunc(sysdate),其实是多余的。只要sysdate就可以了。本来就是日期类型。
    最后的Order by也是多余的。rownum注定了它的结果不需要排序。mantisXF的做法呢,
    就是在没有connect by出现之前常用的做法。
    而且还有错误。错误的原因在,多加了最外面的条件“where to_char(trunc(sysdate,'mm'),'dd') - rownum + 1 >= 0”。
    tt本来就是有条件的,已经有了日期作为条件。
    加了这个条件,画蛇添足,还错了。
    to_char(trunc(sysdate,'mm'),'dd') 肯定就是1,条件就变成了 1 - rownum + 1 >= 0  也就是说,2 >= rownum,就是说,注定只有2条记录。从执行效率来说,和上面的做法比较起来,比较差。而且all_objects这个系统表,有着数据库所有的对象的记录,起码都有几万条,对于一个最多只是希望得到31条的数据,需要用它嘛?赫赫。
      

  7.   

    declare
      inum   number;
      vdate  date;
    begin
      inum:=sysdate-trunc(sysdate,'MM')-1;
      for i in 0..inum loop
        vdate:=trunc(sysdate,'MM')+i; 
        dbms_output.put_line(to_char(vdate,'YYYY-mm-dd'));
      end loop;
    end
    是不是应该这个:
      inum:=sysdate-trunc(sysdate,'MM')-1;
      

  8.   

    SELECT TO_CHAR(SYSDATE - (ROWNUM - 1), 'yyyy-mm-dd') RN
      FROM DUAL
    CONNECT BY ROWNUM <= TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'), 'yyyy-mm-dd') + 1 -
               TRUNC(SYSDATE, 'mm')
     ORDER BY (SYSDATE - (ROWNUM - 1))