求帮忙优化sql语句

lewrence 2013-06-27 04:59:11
大哥、大姐们:
请帮我看看,谢谢了,我就50分了,全给了。
要求是查出第一段时间内(我的sql里4月1号到9月1号),间隔几周(我sql里是3周),某个星期几(代码里是1和4)的日期,我这个将查询时间段拉长,间隔时间改小,就算不出来了,请帮忙优化下,多谢。
Select tdate, week
From (Select to_char(c1, 'yyyymmdd') tdate,
decode(to_char(c1, 'd'),
'1',
'seven',
'2',
'one',
'3',
'two',
'4',
'three',
'5',
'four',
'6',
'five',
'7',
'six') week
From (
--得出每个周日和往前推6天的日期
Select Distinct c1 - Level + 1 c1
From (
--根据最小的日期一次往前推3周
Select c1 + (3 * 7) *
(Level - 1) c1
From (
--计算为周日的最小日期
Select Min(c1) c1
From (
--构造4月1号到9月1号的日期表
Select to_date('2013-04-01','yyyy-mm-dd') + Level - 1 c1
From dual
Connect By Level <=
to_date('2013-09-01','yyyy-mm-dd') - to_date('2013-04-01','yyyy-mm-dd') + 1)
Where to_char(c1, 'd') = 1)
Connect By Level <=
(to_date('2013-09-01','yyyy-mm-dd') - to_date('2013-04-01','yyyy-mm-dd')) /
(3 * 7) + 1)
Connect By Level < 8
Order By c1)
Where c1 >= to_date('2013-04-01','yyyy-mm-dd'))q
Where Exists (Select week
From ( /**将某字段,由逗行分隔的值转成列**/
Select REGEXP_SUBSTR('one,four', '[^,]+', 1, rownum) As week
From DUAL
Connect By ROWNUM <= LENGTH('one,four') -
LENGTH(Replace('one,four', ',')) + 1) w
Where w.week = q.week)
...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Regan-lin 2013-06-30
  • 打赏
  • 举报
回复
你可以试下用Timespan 时间间隔类来做下,我实在是看不懂你上面的要求,不过是求间隔的这个类应该做的了!
lewrence 2013-06-28
  • 打赏
  • 举报
回复
需求:就是要查某段时间内间隔任意周次的任意星期几的日期。 入参有四个,分别是开始日期,结束日期,间隔周次,要查询的星期几(这个参数暂时定为‘one,two...seven’样式)
lewrence 2013-06-27
  • 打赏
  • 举报
回复
引用 2 楼 lewrence 的回复:
就是要查某段时间内间隔任意周次的任意星期几的日期
引用 3 楼 u010412956 的回复:
Where Exists (Select week From ( /**将某字段,由逗行分隔的值转成列**/ Select REGEXP_SUBSTR('one,four', '[^,]+', 1, rownum) As week From DUAL Connect By ROWNUM <= LENGTH('one,four') - LENGTH(Replace('one,four', ',')) + 1) w Where w.week = q.week) 你上面这段话的作用 就 说明 是间隔 3周?
不是上面的3*7里面的3是间隔三周,这个'one,four'代表的是查星期一和星期四
u010412956 2013-06-27
  • 打赏
  • 举报
回复
Where Exists (Select week From ( /**将某字段,由逗行分隔的值转成列**/ Select REGEXP_SUBSTR('one,four', '[^,]+', 1, rownum) As week From DUAL Connect By ROWNUM <= LENGTH('one,four') - LENGTH(Replace('one,four', ',')) + 1) w Where w.week = q.week) 你上面这段话的作用 就 说明 是间隔 3周?
lewrence 2013-06-27
  • 打赏
  • 举报
回复
就是要查某段时间内间隔任意周次的任意星期几的日期
u010412956 2013-06-27
  • 打赏
  • 举报
回复
看不懂你说啥

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧