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

本文介绍如何使用Oracle数据库的功能批量生成20万条数据,并确保这些数据在指定时间段内的每个月都有约两万条记录。此外,还展示了如何随机排序并更新数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用到的大概功能: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

### 如何在 PGSQL生成随机序列 在 PostgreSQL 或兼容的数据库(如 openGauss)中,可以利用内置函数 `generate_series` 和 `random()` 来生成随机序列。以下是几种常见的方法来实现这一目标。 #### 方法一:基于固定间隔的时间生成随机时间序列 通过结合 `generate_series` 函数和 `random()` 函数,可以在指定范围内生成带有随机偏移量的时间戳序列。以下是一个示例: ```sql SELECT to_char( generate_series('2023-01-01'::timestamp, '2023-12-31'::timestamp, '1 day') + (random() * interval '1 day'), 'YYYY-MM-DD HH24:MI:SS' ) AS random_time; ``` 此查询生成从 `'2023-01-01'` 到 `'2023-12-31'` 的每一天,并为每个日期添加一个介于 0 至 24 小时之间的随机偏移量[^1]。 --- #### 方法二:从预定义数组中随机选取日期 如果需要在一个特定日期范围内生成随机日期,则可以通过创建一个包含该范围内的所有可能日期的数组,并从中随机抽取值。下面是一段 SQL 实现: ```sql WITH date_array AS ( SELECT array_agg(generate_series) AS dates FROM generate_series( '2024-07-03 00:00:00'::timestamp, '2024-07-19 00:00:00'::timestamp, '1 day'::interval ) ) SELECT (dates[ceil(random() * array_length(dates, 1))])::date AS random_date FROM date_array; ``` 这段代码首先使用 `generate_series` 构建了一个日期数组,随后借助 `random()` 和索引操作从中提取单个随机日期[^2]。 --- #### 方法三:生成纯数值型随机数列 对于不需要涉及复杂数据类型的场景,可以直接调用 `random()` 配合乘法因子以及取整运算符 (`floor`, `ceiling`) 得到所需的离散分布随机数集合。例如: ```sql SELECT floor(random() * 100)::int AS rand_num FROM generate_series(1, 5); -- 控制输出数量为五项 ``` 这里展示了如何生成五个位于 `[0, 100)` 范围内的均匀分布伪随机整数[^3]。 --- #### 综合应用实例——混合时间和数字的随机序列 当希望同时获取既有关联又各自独立变化的两组变量时,可考虑如下形式的设计思路: ```sql WITH time_seq AS ( SELECT now() - ((row_number() OVER () || ' hours')::interval) AS ts FROM generate_series(1, 10) ), rand_vals AS ( SELECT floor(random() * 100) AS val FROM generate_series(1, 10) ) SELECT ts, val FROM time_seq CROSS JOIN rand_vals LIMIT 10; ``` 上述脚本先构造了一条递减小时单位的时间轴线程;接着再单独准备另一路由零至百间浮动的数据流;最后经笛卡尔积组合两者并截断展示前十笔录作为最终成果呈现给用户查看[^1][^2]. --- ### 注意事项 - 上述各方案均依赖于系统当前时刻(`now()`)或者人为设定起始终点参数来进行计算处理。 - 如果追求更高的性能表现,在大规模批量生产场合下建议预先缓存好基础素材而非实时动态演算每批次请求所需全部内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值