本人对oracle不熟悉,因为工作上遇到这个问题,查了一些东西,但是没有解决这个难题。请Oracle专家门给点建议,先谢谢了。问题是: Oracle 如何获取上个月的第一天星期天和最后一个星期天的日期

解决方案 »

  1.   

    select trunc(trunc(add_months(sysdate,-1),'mm'),'day')+7 from dual;select trunc(trunc(sysdate,'mm'),'day') from dual;
      

  2.   


    --没测试,不知道对不对?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;
      

  3.   

    --第一天
    select next_day(add_months(trunc(sysdate,'month'),-1),'星期日') from dual;
      

  4.   

    思路:
    1.查询出第一天所在周的第一天,这个可以直接用trunc(date,'day')获得,然后在此基础上+7天,
    应该就是第一个星期天。
    2.查询出最后一天所在周的第一天,这个可以直接用trunc(date,'day')获得,然后在此基础上+7天,
    此时如果超过了当月,应该取trunc(date,'day')基础上减去一天,这个就是最后一个星期天思路不对的地方请高人斧正
      

  5.   


    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
      

  6.   


    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> 
      

  7.   


    --最终结果:
    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;
      

  8.   


    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> 
      

  9.   

    sorry ,这个忘考虑了,需要再修改我9楼的
      

  10.   


    --现在应该可以了吧,呵呵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;
      

  11.   

    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> 
      

  12.   

    先trunc(sysdate,'mm')-1得到上月最后一天,然后减去(该天在本周中天数-1)即可得到上月最后一个周日,
    去括号即本月第一天减去上月最后一天在周中的天数,上个月第一天可以用上上月最后一一个周日的日子+7即可..
      

  13.   

    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
      

  14.   


    上面写成上月第一周的第一天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> 
      

  15.   

    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.
      

  16.   

    Hi 各位高手,
    如果这样:
    select * from tbl_test where startdate between to_date(上个月的第一个星期天) and to_date(上个月的最后一个星期天)然后把结果放到一个.txt的文件中保存起来,是不是需要写一个procedure呢?不知道各位有没有时间帮忙一下。谢谢!
      

  17.   

    用SQLPLUS命令 spool就可以了
      

  18.   


    spool c:\test.txt
    select * from tbl_test where startdate between to_date(上个月的第一个星期天) and to_date(上个月的最后一个星期天)
    spool off
      

  19.   

    spool  加路径
    执行语句
    spool off
      

  20.   

    谢谢, 
    spool 加路径
    执行语句
    spool off
    这个学到了。关键是 上个月的第一个星期天,上个月的最后一个星期天 也是变量,这样是不是只有procedure才能实现呢?
      

  21.   

    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
      

  22.   

    最优化结果:
    SELECT Trunc(Last_Day(Add_Months(SYSDATE, -2)), 'd') + 7 上月第一周日,
           Trunc(Last_Day(Add_Months(SYSDATE, -1)), 'd') 上月最后周日
      FROM Dual
      

  23.   

    select next_day(trunc(add_months(sysdate,-1),'mm')-1,'星期天'),next_day(last_day(trunc(add_months(sysdate,-1),'mm'))-7,'星期天'),  from dual;
    星期天=sun