日期:2014-05-16  浏览次数:20814 次

难点
写存储过程插入数据
时间有要求 取从1999-01-01到2013-07-01中获取随机一天;(周末和周日除外)
这个时间什么得到呢
存储

------解决方案--------------------
select t.adate
from (select to_date('1999-01-01','yyyy-mm-dd')+level-1  adate,row_number() over(order by dbms_random.value) rn
      from dual
      where to_char(to_date('1999-01-01','yyyy-mm-dd')+level-1,'day')not in ('星期六','星期日')
      connect by level <= to_date('2013-07-01','yyyy-mm-dd')-to_date('1999-01-01','yyyy-mm-dd')+1
      ) t
where t.rn=1;

------解决方案--------------------
引用:
select t.adate
from (select to_date('1999-01-01','yyyy-mm-dd')+level-1  adate,row_number() over(order by dbms_random.value) rn
      from dual
      where to_char(to_date('1999-01-01','yyyy-mm-dd')+level-1,'day')not in ('星期六','星期日')
      connect by level <= to_date('2013-07-01','yyyy-mm-dd')-to_date('1999-01-01','yyyy-mm-dd')+1
      ) t
where t.rn=1;


方法上可行,不过有点浪费cpu和内存了。
可以折衷下,例如
DECLARE
  VN_A  NUMBER;
  vn_random number;
  vt_day date;
BEGIN
  VN_A:="2013-07-01"-"1900-01-01" ; --写个意思.
  vn_random:=dbms_random.value(1,vn_a);
  vt_day:="1900-01-01"+vn_random;
  --然后如果vt_day是周六或者周日那么就切换为下一个周一或者上个周五。  
END;

这样应该能够满足需要。