SQL> SQL> select case 2 when next_day(first_day, '星期一') = first_day + 1 then ------如果这个月的第一天正好日周日,则取当天 3 first_day 4 else 5 next_day(first_day, '星期日') ---------否则使用取下个星期日。 6 end first_sunday, 7 case 8 when next_day(last_day, '星期一') = last_day + 1 then ----如果这个月的最后一天真好是周日,则取当天 9 last_day 10 when trunc(next_day(last_day, '星期日'), 'mm') = -----如果最后一天所在的周的周日跨月,则取上个星期天 11 trunc(sysdate, 'mm') then 12 trunc(last_day, 'day') - 1 13 else -----正常情况取最后一天下个周日 14 trunc(last_day, 'day') + 6 15 end last_sunday 16 from (select add_months(trunc(sysdate, 'month'), -1) first_day, 17 trunc(last_day(add_months(sysdate, -1))) last_day 18 from dual);FIRST_SUNDAY LAST_SUNDAY ------------ ----------- 2010-10-3 2010-10-31SQL>
--最终结果: 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)) ELSE last_day(add_months(sysdate,-1))+(7-to_char(last_day(add_months(sysdate,-1)),'d'))+1 END 上个月的最后一个星期天 from dual;
SQL> select case 2 when next_day(first_day, '星期一') = first_day + 1 then ------如果这个月的第一天正好日周日,则取当天 3 first_day 4 else 5 next_day(first_day, '星期日') ---------否则使用取下个星期日。 6 end first_sunday, 7 case 8 when next_day(last_day, '星期一') = last_day + 1 then ----如果这个月的最后一天真好是周日,则取当天 9 last_day 10 when trunc(next_day(last_day, '星期日'), 'mm') = -----如果最后一天所在的周的周日跨月,则取上个星期天 11 trunc(sysdate, 'mm') then 12 trunc(last_day, 'day') - 1 13 else -----正常情况取最后一天下个周日 14 trunc(last_day, 'day') + 6 15 end last_sunday 16 from (select add_months(trunc(sysdate, 'month'), -1) first_day, 17 trunc(last_day(add_months(sysdate, -1))) last_day 18 from dual);FIRST_SUNDAY LAST_SUNDAY ------------ ----------- 2010-10-3 2010-10-31SQL>
sorry ,这个忘考虑了,需要再修改我9楼的
--现在应该可以了吧,呵呵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;
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;
Thanks everyone, I need time to do research for all your solutions. The result will come soon. I can say I found wkc168's way is the easiest one and the result seem correct by now.
Hi 各位高手, 如果这样: select * from tbl_test where startdate between to_date(上个月的第一个星期天) and to_date(上个月的最后一个星期天)然后把结果放到一个.txt的文件中保存起来,是不是需要写一个procedure呢?不知道各位有没有时间帮忙一下。谢谢!
用SQLPLUS命令 spool就可以了
spool c:\test.txt select * from tbl_test where startdate between to_date(上个月的第一个星期天) and to_date(上个月的最后一个星期天) spool off
spool 加路径 执行语句 spool off
谢谢, spool 加路径 执行语句 spool off 这个学到了。关键是 上个月的第一个星期天,上个月的最后一个星期天 也是变量,这样是不是只有procedure才能实现呢?
SELECT MIN(First_Day + b.Rn - 1) AS First_Sunday, MAX(First_Day + b.Rn - 1) AS Last_Sunday FROM (SELECT Add_Months(Trunc(SYSDATE, 'month'), -1) AS First_Day, Trunc(Last_Day(Add_Months(SYSDATE, -1))) - Add_Months(Trunc(SYSDATE, 'month'), -1) + 1 AS Days FROM Dual) a, (SELECT Rownum AS Rn FROM Dual CONNECT BY Rownum <= 31) b WHERE a.Days >= b.Rn AND To_Char(First_Day + b.Rn - 1, 'd') = 1
--没测试,不知道对不对?select trunc(add_months(sysdate,-1),'mm') 上个月的第一天,
last_day(add_months(sysdate,-1)) 上个月的最后一天,
trunc(add_months(sysdate,-1),'mm')+(7-to_char(trunc(add_months(sysdate,-1),'mm'),'d'))+1 上个月的第一个星期天,
last_day(add_months(sysdate,-1))+to_char(last_day(add_months(sysdate,-1)),'d') 上个月的最后一个星期天
from dual;
select next_day(add_months(trunc(sysdate,'month'),-1),'星期日') from dual;
1.查询出第一天所在周的第一天,这个可以直接用trunc(date,'day')获得,然后在此基础上+7天,
应该就是第一个星期天。
2.查询出最后一天所在周的第一天,这个可以直接用trunc(date,'day')获得,然后在此基础上+7天,
此时如果超过了当月,应该取trunc(date,'day')基础上减去一天,这个就是最后一个星期天思路不对的地方请高人斧正
select trunc(trunc(add_months(to_date('20100101','yyyymmdd'),-1),'mm'),'day')+7,
trunc(trunc(to_date('20100101','yyyymmdd'),'mm'),'day')
from dual
TRUNC(TRUNC(AD TRUNC(TRUNC(TO
-------------- --------------
06-12月-09 27-12月-09
--paddy兄的有点错误
select trunc(add_months(sysdate,-1),'mm') 上个月的第一天,
last_day(add_months(sysdate,-1)) 上个月的最后一天,
trunc(add_months(sysdate,-1),'mm')+(7-to_char(trunc(add_months(sysdate,-1),'mm'),'d'))+1 上个月的第一个星期天,
last_day(add_months(sysdate,-1))+to_char(last_day(add_months(sysdate,-1)),'d') 上个月的最后一个星期天
from dual;--最后一个星期天应该是31-10月-10
上个月的第一天 上个月的最后一 上个月的第一个 上个月的最后一
-------------- -------------- -------------- --------------
01-10月-10 31-10月-10 03-10月-10 01-11月-10
SQL>
SQL> select case
2 when next_day(first_day, '星期一') = first_day + 1 then ------如果这个月的第一天正好日周日,则取当天
3 first_day
4 else
5 next_day(first_day, '星期日') ---------否则使用取下个星期日。
6 end first_sunday,
7 case
8 when next_day(last_day, '星期一') = last_day + 1 then ----如果这个月的最后一天真好是周日,则取当天
9 last_day
10 when trunc(next_day(last_day, '星期日'), 'mm') = -----如果最后一天所在的周的周日跨月,则取上个星期天
11 trunc(sysdate, 'mm') then
12 trunc(last_day, 'day') - 1
13 else -----正常情况取最后一天下个周日
14 trunc(last_day, 'day') + 6
15 end last_sunday
16 from (select add_months(trunc(sysdate, 'month'), -1) first_day,
17 trunc(last_day(add_months(sysdate, -1))) last_day
18 from dual);FIRST_SUNDAY LAST_SUNDAY
------------ -----------
2010-10-3 2010-10-31SQL>
--最终结果:
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))
ELSE
last_day(add_months(sysdate,-1))+(7-to_char(last_day(add_months(sysdate,-1)),'d'))+1
END 上个月的最后一个星期天
from dual;
SQL> select case
2 when next_day(first_day, '星期一') = first_day + 1 then ------如果这个月的第一天正好日周日,则取当天
3 first_day
4 else
5 next_day(first_day, '星期日') ---------否则使用取下个星期日。
6 end first_sunday,
7 case
8 when next_day(last_day, '星期一') = last_day + 1 then ----如果这个月的最后一天真好是周日,则取当天
9 last_day
10 when trunc(next_day(last_day, '星期日'), 'mm') = -----如果最后一天所在的周的周日跨月,则取上个星期天
11 trunc(sysdate, 'mm') then
12 trunc(last_day, 'day') - 1
13 else -----正常情况取最后一天下个周日
14 trunc(last_day, 'day') + 6
15 end last_sunday
16 from (select add_months(trunc(sysdate, 'month'), -1) first_day,
17 trunc(last_day(add_months(sysdate, -1))) last_day
18 from dual);FIRST_SUNDAY LAST_SUNDAY
------------ -----------
2010-10-3 2010-10-31SQL>
--现在应该可以了吧,呵呵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;
TRUNC(ADD_MONTHS(SYSDATE,-1),' TRUNC(SYSDATE,'MM')-TO_CHAR(TR
------------------------------ ------------------------------
2010-10-3 2010-10-31
SQL>
去括号即本月第一天减去上月最后一天在周中的天数,上个月第一天可以用上上月最后一一个周日的日子+7即可..
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'),
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>
The result will come soon. I can say I found wkc168's way is the easiest one and the result seem correct by now.
如果这样:
select * from tbl_test where startdate between to_date(上个月的第一个星期天) and to_date(上个月的最后一个星期天)然后把结果放到一个.txt的文件中保存起来,是不是需要写一个procedure呢?不知道各位有没有时间帮忙一下。谢谢!
spool c:\test.txt
select * from tbl_test where startdate between to_date(上个月的第一个星期天) and to_date(上个月的最后一个星期天)
spool off
执行语句
spool off
spool 加路径
执行语句
spool off
这个学到了。关键是 上个月的第一个星期天,上个月的最后一个星期天 也是变量,这样是不是只有procedure才能实现呢?
MAX(First_Day + b.Rn - 1) AS Last_Sunday
FROM (SELECT Add_Months(Trunc(SYSDATE, 'month'), -1) AS First_Day,
Trunc(Last_Day(Add_Months(SYSDATE, -1))) -
Add_Months(Trunc(SYSDATE, 'month'), -1) + 1 AS Days
FROM Dual) a,
(SELECT Rownum AS Rn FROM Dual CONNECT BY Rownum <= 31) b
WHERE a.Days >= b.Rn
AND To_Char(First_Day + b.Rn - 1, 'd') = 1
SELECT Trunc(Last_Day(Add_Months(SYSDATE, -2)), 'd') + 7 上月第一周日,
Trunc(Last_Day(Add_Months(SYSDATE, -1)), 'd') 上月最后周日
FROM Dual
星期天=sun