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

时间:2022-04-13 07:56:52

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

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

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

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

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

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');

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

参考文章:

Oracle生成随机日期时间

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

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

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

oracle 查询按月份分组

oracle批量update