oracle 取当月到现在的时间天,比如今天是1月2号.那取出来的就是:
2008-01-01
2008-01-02如果今天是1月20号,那就:
2008-01-01
2008-01-02
.....
.....
.....
2008-01-20
这个语句应该怎么写?
2008-01-01
2008-01-02如果今天是1月20号,那就:
2008-01-01
2008-01-02
.....
.....
.....
2008-01-20
这个语句应该怎么写?
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
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;
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
from dual
connect by trunc(sysdate,'mm') + rownum - 1 <= trunc(sysdate)
order by day ASC
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条的数据,需要用它嘛?赫赫。
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;
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))