ITPUB论坛 » Oracle开发 » 用一条SQL语句做一个星期月历
新一届的微软MVP评选已经开始,欢迎各位推荐!
2008-7-6 20:47 8193102
用一条SQL语句做一个星期月历

select sum(decode(eachday, 0, dayid, NULL)) "日",
sum(decode(eachday, 1, dayid, NULL)) "一",
sum(decode(eachday, 2, dayid, NULL)) "二",
sum(decode(eachday, 3, dayid, NULL)) "三",
sum(decode(eachday, 4, dayid, NULL)) "四",
sum(decode(eachday, 5, dayid, NULL)) "五",
sum(decode(eachday, 6, dayid, NULL)) "六" from (
select monthday, to_number(to_char(monthday, 'dd')) as dayid, weekday, round((weekday+3.5) / 7,0) weekid, mod(weekday+7, 7 ) eachday from (
select trunc(sysdate,'month')+rownum -1  as monthday, trunc(sysdate,'month')+rownum +6  - next_day(trunc(sysdate,'month'),1) as weekday from all_objects
where rownum <= ( select to_char(last_day( sysdate ),'dd') from dual ) )
)
group by weekid;

这个就是结果,兄弟们看看,有什么新想法:)

2008-7-6 20:54 sunfly1983
先顶一个再说!(*^__^*) !

2008-7-6 21:09 sunfly1983
修改一下:
加个年月日:
select sum(decode(eachday, 0, dayid, NULL)) "日",
sum(decode(eachday, 1, dayid, NULL)) "一",
sum(decode(eachday, 2, dayid, NULL)) "二",
sum(decode(eachday, 3, dayid, NULL)) "三",
sum(decode(eachday, 4, dayid, NULL)) "四",
sum(decode(eachday, 5, dayid, NULL)) "五",
sum(decode(eachday, 6, dayid, NULL)) "六" from (
select monthday, to_number(to_char(monthday, 'dd')) as dayid, weekday, round((weekday+3.5) / 7,0) weekid, mod(weekday+7, 7 ) eachday from (
select trunc(sysdate,'month')+rownum -1  as monthday, trunc(sysdate,'month')+rownum +6  - next_day(trunc(sysdate,'month'),1) as weekday from all_objects
where rownum <= ( select to_char(last_day( sysdate ),'dd') from dual ) )
)
group by weekid
union all
select null,null,null,null,null,null,to_number(to_char(sysdate,'yyyymmdd')) from dual

2008-7-6 21:47 zhangfengh
。。。。。。。。。。

[[i] 本帖最后由 zhangfengh 于 2008-7-6 21:48 编辑 [/i]]

2008-7-6 23:01 8193102
改得有点意思,以此为由,我写过一篇文章,发表在<软件报>上的

我的原文在此:
[url=http://blog.sina.com.cn/s/blog_511846a201008yw3.html]http://blog.sina.com.cn/s/blog_511846a201008yw3.html[/url]

[quote]原帖由 [i]sunfly1983[/i] 于 2008-7-6 21:09 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=10872415&ptid=1017537][img]http://www.itpub.net/images/common/back.gif[/img][/url]
修改一下:
加个年月日:
select sum(decode(eachday, 0, dayid, NULL)) "日",
sum(decode(eachday, 1, dayid, NULL)) "一",
sum(decode(eachday, 2, dayid, NULL)) "二",
sum(decode(eachday, 3, dayid, NULL)) "三",
sum(decode(eachday, 4, dayid, NULL)) "四",
sum(decode(eachday, 5, dayid, NULL)) "五",
sum(decode(eachday, 6, dayid, NULL)) "六" from (
select monthday, to_number(to_char(monthday, 'dd')) as dayid, weekday, round((weekday+3.5) / 7,0) weekid, mod(weekday+7, 7 ) eachday from (
select trunc(sysdate,'month')+rownum -1  as monthday, trunc(sysdate,'month')+rownum +6  - next_day(trunc(sysdate,'month'),1) as weekday from all_objects
where rownum  [/quote]

2008-7-7 08:07 songmiaoyhm
一個字:牛!

2008-7-7 09:08 junsansi
[url]http://space.itpub.net/7607759/viewspace-220372[/url]

2008-7-7 10:05 grubbyoo
select   
        max(decode(mod(n,7),0,m,null))  日,
        max(decode(mod(n,7),1,m,null))  一,
        max(decode(mod(n,7),2,m,null))  二,
        max(decode(mod(n,7),3,m,null))  三,
        max(decode(mod(n,7),4,m,null))  四,
        max(decode(mod(n,7),5,m,null))  五,
        max(decode(mod(n,7),6,m,null))  六
from
    (  select rownum m, rownum+to_char(trunc(sysdate,'mm'),'d')-2 n
       from  dual
       connect by rownum< = to_char(last_day(sysdate),'dd') )
group by trunc(n/7)
order by trunc(n/7)

2008-7-7 10:09 haibo_li

2008-7-7 10:09 jvkojvko
学习了

2008-7-7 10:11
年历:
[url]http://www.itpub.net/thread-469543-1-1.html[/url]

2008-7-7 10:16 grubbyoo
加强一下 当天有星号标示

select   
        max(decode(mod(n,7),0,decode(f,1,'*'||m||'*',m),null))  日,
        max(decode(mod(n,7),1,decode(f,1,'*'||m||'*',m),null))  一,
        max(decode(mod(n,7),2,decode(f,1,'*'||m||'*',m),null))  二,
        max(decode(mod(n,7),3,decode(f,1,'*'||m||'*',m),null))  三,
        max(decode(mod(n,7),4,decode(f,1,'*'||m||'*',m),null))  四,
        max(decode(mod(n,7),5,decode(f,1,'*'||m||'*',m),null))  五,
        max(decode(mod(n,7),6,decode(f,1,'*'||m||'*',m),null))  六
from
    (select rownum m, rownum+to_char(trunc(sysdate,'mm'),'d')-2 n,
            decode(rownum,TO_NUMBER(to_CHAR(sysdate,'dd')),1,0) F
       from  dual
    connect by rownum< = to_char(last_day(sysdate),'dd') )
group by trunc(n/7)
order by trunc(n/7)

2008-7-7 10:17 jvkojvko
[quote]原帖由 [i]junsansi[/i] 于 2008-7-7 09:08 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=10874156&ptid=1017537][img]http://www.itpub.net/images/common/back.gif[/img][/url]
[url]http://space.itpub.net/7607759/viewspace-220372[/url] [/quote]

看了三思的代码,
把connect by rownum <= trunc(sysdate+365,'yyyy')-trunc(sysdate,'yyyy')改成这样就不用考虑一年是365还是366了
connect by rownum <= trunc(sysdate+ Interval '1' Year,'yyyy')-trunc(sysdate,'yyyy')

2008-7-7 10:58 grubbyoo
回复 #13 jvkojvko 的帖子

借用  jvkojvko 的  trunc(sysdate+ Interval '1' Year,'yyyy')-trunc(sysdate,'yyyy')
  整个年的日历
  select  mm 月份,
        max(decode(mod(d,7),0,dd,null))  日,
        max(decode(mod(d,7),1,dd,null))  一,
        max(decode(mod(d,7),2,dd,null))  二,
        max(decode(mod(d,7),3,dd,null))  三,
        max(decode(mod(d,7),4,dd,null))  四,
        max(decode(mod(d,7),5,dd,null))  五,
        max(decode(mod(d,7),6,dd,null))  六
     from
   ( select to_char(d,'yyyy-mm')     mm ,
            to_char(d,'dd')          dd ,
            to_char(d,'dd')+to_char(trunc(d,'mm'),'d')-2  d
    from
   ( select trunc(sysdate,'y')+rownum-1 d from dual
     connect by rownum< =trunc(sysdate+ Interval '1' Year,'yyyy')-trunc(sysdate,'yyyy') ))
    group  by mm,trunc(d/7)
   order by  mm,trunc(d/7)

[[i] 本帖最后由 grubbyoo 于 2008-7-7 11:02 编辑 [/i]]

2008-7-7 11:30 shiguibao
呵呵,有意思

2008-7-7 12:32 caizhuoyi
回复 #14 grubbyoo 的帖子

不错,要是加个阴历,就更有难度了。

2008-7-7 13:16 8193102
[quote]原帖由 [i]grubbyoo[/i] 于 2008-7-7 10:05 发表 [url=http://www.itpub.net/redirect.php?goto=findpost&pid=10875010&ptid=1017537][img]http://www.itpub.net/images/common/back.gif[/img][/url]
select   
        max(decode(mod(n,7),0,m,null))  日,
        max(decode(mod(n,7),1,m,null))  一,
        max(decode(mod(n,7),2,m,null))  二,
        max(decode(mod(n,7),3,m,null))  三,
        max(decode(mod(n,7),4,m,null))  四,
        max(decode(mod(n,7),5,m,null))  五,
        max(decode(mod(n,7),6,m,null))  六
from
    (  select rownum m, rownum+to_char(trunc(sysdate,'mm'),'d')-2 n
       from  dual
       connect by rownum< = to_char(last_day(sysdate),'dd') )
group by trunc(n/7)
order by trunc(n/7) [/quote]

强,看来群众的力量还是无限的

2008-7-7 13:51 gerard
对不起了.借例子的SQL,顺便问点问题.
为什么我单独执行
select rownum m, rownum+to_char(trunc(sysdate,'mm'),'d')-2 n
from  dual
connect by rownum< = to_char(last_day(sysdate),'dd')
只出现一条结果?dual返回行数怎么限制的.全部执行没问题!

这里connect by 是不是有点end while(false)的意思?
start with可有可无吗?
附:
CONNECT BY
格式:select expression from table
where condition
connect by [prior] expression= [prior] expression
start with expression = expression
order by expression
描述:CONNECT BY是一个运算符,在select 语句中用来建交反映树形结构数据,
START WITH指示从树的何处开始。

2008-7-7 15:14 bin_wind
學習

2008-7-7 15:34 liang573728
学习了

页: [1] 2


Powered by ITPUB论坛