生成规定时间段内随机日期——记一次SQL查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_22073849/article/details/78542647

用到的大概功能:Oracle 的随机数、随机日期和时间,Oracle的trunc和dbms_random.value随机取n条数据, INSERT INTO SELECT 的使用,oracle 查询按月份分组,oracle批量update

需求:要给一张修改记录表(CARD_PERSON_MODIFY_RECORD)增加20多万条数据,保证其中的修改时间字段在每个月至少有两万左右的数据,关联表为(CARD_PERSON),关联字段为前表中的CARD_PERSON_ID

别问我为什么要弄虚作假 =。=

这里写图片描述

生成规定时间段内(今年一月份到今天,每天早上九点到下午六点)的随机日期

SELECT to_date(TRUNC(DBMS_RANDOM.VALUE(to_number(to_char(to_date('20170101',
                                                                 'yyyymmdd'),
                                                         'J')),
                                       to_number(to_char(to_date('20171115',
                                                                 'yyyymmdd') + 1,
                                                         'J')))),
               'J') + DBMS_RANDOM.VALUE(1350, 2700) / 3600 prize_time
  FROM dual;

貌似最麻烦的一个环节已经解决了,那么我们下面弄到那20万条数据吧,然后再统一update一下就好了

insert into card_person_modify_record
  (id, card_person_id, is_enabled, system_users_id, system_users_name)
  select seq_card_person_modify_record.nextval,
         c.id,
         c.is_enabled,
         2,
         'admin02'
    from (select id, is_enabled
             from card_person
            order by trunc(dbms_random.value(1, 2000000)))

         c
   where rownum <= 200000


select * from card_person_modify_record

**把这二百万数据随机排序取前20万。
然后我们把空缺的“修改时间”补上去**

update card_person_modify_record t
   set t.modify_date = to_date(TRUNC(DBMS_RANDOM.VALUE(to_number(to_char(to_date('20170101',
                                                                                 'yyyymmdd'),
                                                                         'J')),
                                                       to_number(to_char(to_date('20171115',
                                                                                 'yyyymmdd') + 1,
                                                                         'J')))),
                               'J') + DBMS_RANDOM.VALUE(1350, 2700) / 3600
 where t.modify_date is null

最后我们统计下每个月都是多少


select to_char(modify_date,'yyyy-mm'),count(*) from card_person_modify_record group by to_char(modify_date,'yyyy-mm')
  order by to_char(modify_date,'yyyy-mm');

这里写图片描述

参考文章:

Oracle生成随机日期时间

Oracle 的随机数、随机日期和时间、随机字符串

Oracle的trunc和dbms_random.value随机取n条数据

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解(SQL数据库和Oracle数据库的区别)

oracle 查询按月份分组

oracle批量update

猜你喜欢

转载自blog.csdn.net/qq_22073849/article/details/78542647
今日推荐