17,078
社区成员
发帖
与我相关
我的任务
分享
spool c:\test.txt
select * from tbl_test where startdate between to_date(上个月的第一个星期天) and to_date(上个月的最后一个星期天)
spool off
SQL> select trunc(add_months(sysdate,-1),'mm'),
2 decode(to_char(trunc(add_months(sysdate,-1),'mm'),'d'),1,trunc(add_months(sysdate,-1),'mm'),next_day(trunc(add_months(sysdate,-1),'mm'),1)) "第一个",
3 last_day(add_months(sysdate,-1))-to_char(last_day(add_months(sysdate,-1)),'d')+1 "最后一个"
4 from dual
5 /
TRUNC(ADD_MONTHS(SYSDATE,-1),' 第一个 最后一个
------------------------------ ----------- -----------
2010-10-1 2010-10-3 2010-10-31
SQL>
SQL> select trunc(add_months(sysdate,-1),'mm'),
2 trunc(add_months(sysdate,-1),'mm')-to_char(trunc(add_months(sysdate,-1),'mm'),'d')+1 "第一个",
3 last_day(add_months(sysdate,-1))-to_char(last_day(add_months(sysdate,-1)),'d')+1 "最后一个"
4 from dual
5 /
TRUNC(ADD_MONT 第一个 最后一个
-------------- -------------- --------------
01-10月-10 26-9月 -10 31-10月-10
SQL> select trunc(add_months(sysdate,-1),'mm')-to_char(trunc(add_months(sysdate,-1),'mm')-1,'d')+7,trunc(sysdate,'mm')-to_char(trunc(sysdate,'mm')-1,'d') from dual;
TRUNC(ADD_MONTHS(SYSDATE,-1),' TRUNC(SYSDATE,'MM')-TO_CHAR(TR
------------------------------ ------------------------------
2010-10-3 2010-10-31
SQL>
--现在应该可以了吧,呵呵O(∩_∩)O~
select
CASE WHEN To_Char(trunc(add_months(sysdate,-1),'mm'),'d')=1 --判断第一天是否是周日
THEN trunc(add_months(sysdate,-1),'mm')
ELSE
trunc(add_months(sysdate,-1),'mm')+(7-to_char(trunc(add_months(sysdate,-1),'mm'),'d'))+1
END 上个月的第一个星期天,
CASE WHEN To_Char(last_day(add_months(sysdate,-1)),'d')=1 --判断最后一天是否是周日
THEN last_day(add_months(sysdate,-1))
WHEN trunc((last_day(add_months(sysdate,-1))+(7-to_char(last_day(add_months(sysdate,-1)),'d'))+1),'mm')!=trunc(sysdate,'mm')--判断最后一个周日跨月,则取上个星期天
THEN last_day(add_months(sysdate,-1))-to_char(last_day(add_months(sysdate,-1)),'d')+1
ELSE
last_day(add_months(sysdate,-1))+(7-to_char(last_day(add_months(sysdate,-1)),'d'))+1
END 上个月的最后一个星期天
from dual;